Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何继承具有不同数量必需参数的泛型方法_C#_Generics_Inheritance_Parameters_Polymorphism - Fatal编程技术网

C#如何继承具有不同数量必需参数的泛型方法

C#如何继承具有不同数量必需参数的泛型方法,c#,generics,inheritance,parameters,polymorphism,C#,Generics,Inheritance,Parameters,Polymorphism,在C#中继承带有泛型参数的方法时,处理子类中实际上不需要参数的情况的最佳方法是什么?例如,我想这样做: public abstract class Parent { protected abstract void Load<T>(T param); } public class Child : Parent { protected override void Load() {} } 公共抽象类父类{ 保护抽象空荷载(T参数); } 公共类子级:父级{ 受保护的重

在C#中继承带有泛型参数的方法时,处理子类中实际上不需要参数的情况的最佳方法是什么?例如,我想这样做:

public abstract class Parent { 
    protected abstract void Load<T>(T param); 
}
public class Child : Parent {
    protected override void Load() {}
}
公共抽象类父类{
保护抽象空荷载(T参数);
}
公共类子级:父级{
受保护的重写无效加载(){}
}
如果这样的事情不可能,是否有一个建议的标准实践,在实际不需要的情况下指定t?我是否只是设置为bool之类的值而忽略该值

child.Load<bool>(false);
child.Load(false);

重写函数时,必须保持相同数量(和类型)的参数。您可以重载父方法,但不能重写它:

公共抽象类父类{
保护抽象空荷载(T参数);
}
公共类子级:父级{
受保护的无效加载(){}
受保护的重写无效加载(T参数){//不执行任何操作?}
}

然而,对我来说,这是一种代码味道——制作
Load
abstract本质上告诉实现者他们必须实现这个方法,但是这个类觉得它不需要这样做。如果
Parent
中的代码期望
Load
被正确覆盖;它如何知道
Child
实现了一些其他类型的
Load

一些额外的上下文会很有帮助:
T
Parent
类的通用参数还是仅仅是该方法?
Child
是否继承自
Parent
Child.Load
是否重用来自
Parent.Load
的任何代码。。。有人想知道为什么它首先会在那里;听上去问题在于这两个方法在语义上是不同的,不应该相互重写,或者在某些地方存在对泛型的误用。你能详细说明一下这个用例吗?现实世界中的案例涉及到为UI元素创建一个通用加载程序方法,这些元素可能需要也可能不需要传递上下文数据。我试图找到一种方法使多态性发挥作用,但仔细想想,这在我的用例中实际上是不必要的。谢谢次要缺点:虚拟成员不能是
私有的
,也不允许您更改可访问性(例如,从
公共的
更改为
受保护的
,反之亦然)。此外,在上面的示例中,子级实际上并不继承父级。我的意思是,我认为代码的概念很清楚,但如果它是合法的就更好了。
public abstract class Parent { 
    protected abstract void Load<T>(T param); 
}
public class Child : Parent {
    protected void Load() {}
    protected override void Load<T>(T param) { // do nothing? }
}