2

これが私がコンパイルしようとしているc#コードですtestDMOから継承するかなり単純なtestDMOBase ものです。

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)」を実装していません: オーバーライドする適切なメソッドが見つかりません

オーバーライド メソッドでサブクラスを使用しても問題ありませんか?

4

3 に答える 3

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の命名規則に従う必要があることに注意してください。

于 2013-01-06T21:28:19.480 に答える
4

いいえ、この場合、有効なオーバーライドを提供するには、メソッドのシグネチャに正確に従う必要があります。abstract

したがって、次のように記述する必要があります。

public class test : testBase
{
    override protected void LoadCRUD(testDMOBase dmo)  //BASE CLASS
    { }
}
于 2013-01-06T21:27:09.937 に答える
0

オーバーライドメソッドでサブクラスを使用しても問題ありませんか?

いいえ、メソッドのオーバーライドでは、元の宣言と同じパラメータータイプを使用する必要があります。

于 2013-01-06T21:29:15.860 に答える