我有一个带有重写方法的子类,它总是返回基类中声明的返回类型的一个特定子类型。如果以这种方式编写代码,它就不会编译。因为这可能没有意义,所以让我给出一个代码示例:
class BaseReturnType { }
class DerivedReturnType : BaseReturnType { }
abstract class BaseClass {
public abstract BaseReturnType PolymorphicMethod();
}
class DerivedClass : BaseClass {
// Compile Error: return type must be 'BaseReturnType' to match
// overridden member 'BaseClass.PolymorphicMethod()'
public override DerivedReturnType PolymorphicMethod() {
return new DerivedReturnType();
}
}
在C#中有什么方法可以做到这一点吗?如果没有,实现类似目标的最佳方法是什么?为什么不允许?它似乎不允许任何逻辑不一致,因为从重写方法返回的任何对象。
发布于 2018-08-10 11:18:18
可以将该类改为泛型:
class BaseReturnType { }
class DerivedReturnType : BaseReturnType { }
abstract class BaseClass<T> where T : BaseReturnType
{
public abstract T PolymorphicMethod();
}
class DerivedClass : BaseClass<DerivedReturnType>
{
// Error: return type must be 'BaseReturnType' to match
// overridden member 'BaseClass.PolymorphicMethod()'
public override DerivedReturnType PolymorphicMethod()
{
return new DerivedReturnType();
}
}
发布于 2018-08-10 11:46:26
如果引入一个额外的方法来覆盖,你可以这样做:
abstract class BaseClass
{
public BaseReturnType PolymorphicMethod()
{ return PolymorphicMethodCore();}
protected abstract BaseReturnType PolymorphicMethodCore();
}
class DerivedClass : BaseClass
{
protected override BaseReturnType PolymorphicMethodCore()
{ return PolymorphicMethod(); }
public new DerivedReturnType PolymorphicMethod()
{ return new DerivedReturnType(); }
}
现在,PolymorphicMethod
在每个级别都有一个具有正确类型的方法。
https://stackoverflow.com/questions/-100000538
复制相似问题