使用子类的C#类没有实现继承的抽象成员错误

时间:2013-01-06 21:25:59

标签: c# inheritance override

这是我正在尝试编译的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)':不合适   找到覆盖的方法

不应该在重写方法上使用子类吗?

3 个答案:

答案 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)

  

不应该在重写方法上使用子类吗?

不,方法覆盖必须使用与其原始声明相同的参数类型。