用另一个具有不同参数的抽象方法覆盖抽象方法
本文关键字:抽象方法 参数 覆盖 另一个 | 更新日期: 2023-09-27 18:33:02
我有一个抽象类 ClassA,它有一个抽象方法,它采用 ClassB 类型的参数。从中派生了几个类。现在我添加了另一个项目,它具有类似的功能,但需要一个稍微不同的基 ClassA 来派生它的几个类。主要区别:新的基类 ClassC 不应该将 ClassB 作为参数,而是另一个从 B 派生的基类 ClassD。然后,ClassC 应再次被几个类用作基础。
这可能吗?这更像是一个出于好奇的问题。我知道泛型是可能的,通过这样做:
public abstract void Method1<T>(T parameter) where T : ClassB;
...
public override void Method1<ClassB>(ClassB parameter) {
没有泛型可能吗?除了必须输入两次类型之外,它们还有什么嫁妆吗?
abstract class ClassA
{
public abstract void Method1(ClassB parameter);
}
class DerivingClasses1 : ClassA
{
public override void Method1(ClassB parameter)
{
// do something
}
}
// -------
abstract class ClassC : ClassA
{
// This would have to override Method1 of ClassA somehow,
// instead of overloading it.
public abstract void Method1(ClassD parameter);
}
class DerivingClasses2 : ClassA
{
public override void Method1(ClassD parameter)
{
// do something
}
}
// -------
class ClassB
{
}
class ClassD : ClassB
{
}
在我看来,最好的方法是使用密封的实现重写基类方法,该实现使用新参数类型调用重载,从而使用户免受类型转换的影响。
abstract class ClassC : ClassA
{
public override sealed void Method1(ClassB parameter)
{
this.Method1(parameter as ClassD);
}
public abstract void Method1(ClassD parameter);
}
编辑:如果在生产中使用,则应执行正确的类型检查,以避免出现意外的空值:
abstract class ClassC : ClassA
{
public override sealed void Method1(ClassB parameter)
{
if (!(parameter is ClassD))
throw new ArgumentException(
"Parameter must be of type ClassD.", "parameter");
this.Method1((ClassD)parameter);
}
public abstract void Method1(ClassD parameter);
}
只需在 ClassC 中实现这两种方法即可。
用另一个抽象方法覆盖抽象方法,具有不同的参数
这实际上是不可能的,但是您可以使用通用接口:
interface IMyType {}
class MyTypeBase
{
public abstract void Method1(IMyType parameter);
}