这是我正在尝试编译的c#代码
相当简单,testDMO
继承自testDMOBase
然后测试继承自testBase
public abstract class testDMOBase { }
public class testDMO : testDMOBase { }
public abstract class testBase
{
abstract protected void LoadCRUD(testDMOBase dmo);
}
public class test : testBase
{
override protected void LoadCRUD(testDMO dmo) { }
}
我收到以下错误:
'test'不实现继承的抽象成员 'testBase.LoadCRUD(testDMOBase)''test.LoadCRUD(testDMO)':不合适 找到覆盖的方法
不应该在重写方法上使用子类吗?
答案 0 :(得分:5)
不应该在重写方法上使用子类吗?
没有。除了其他任何内容之外,如果调用者提供的实例其他而不是您的子类,您希望调用哪个实现?
testBase t = new test();
t.LoadCRUD(new SomeOtherDMO()); // What would be called here?
您可能会认为能够使用更通用的子类方法覆盖基本方法是有意义的(例如,使用超类的参数原始参数类型的>,或者是返回类型,它是原始返回类型的子类)但.NET仍然不允许这些类型中的任何一个。重写方法的参数和返回类型必须与原始方法完全匹配,至少在泛型类型参数替换之后。
听起来你可能想让你的基类型通用:
public abstract class TestBase<T> where T : TestDmoBase
{
public abstract void LoadCrud(T dmo);
}
public class Test : TestBase<TestDmo>
{
public override void LoadCrud(TestDmo dmo)
{
...
}
}
请注意,您也应遵循.NET命名约定 - 即使在示例代码中也是如此。
答案 1 :(得分:4)
不,在这种情况下,您必须完全遵循abstract
方法的签名,才能提供有效的覆盖。
所以,你必须写:
public class test : testBase
{
override protected void LoadCRUD(testDMOBase dmo) //BASE CLASS
{ }
}
答案 2 :(得分:0)
不应该在重写方法上使用子类吗?
不,方法覆盖必须使用与其原始声明相同的参数类型。