2

私はやろうとしています:

public abstract class Base
{
    public abstract Task Execute(); 
}

public abstract class Concrete<T> : Base where T : class
{
    new public abstract Task<T> Execute();
}

しかし、何らかの理由でコンパイラエラーが発生しています:

CS0533 'Concrete.Execute()' は、継承された抽象メンバー 'Program.Base.Execute() を非表示にします

過去にたくさんのメンバーを隠してきましたが、このサイドケースに出会ったことがなく、ここでかなり戸惑っています. MSDN と Web で長い時間を費やしましたが、この動作については何も見つかりませんでした。

この問題に関する洞察をいただければ幸いです。

これがフィドルです。

4

2 に答える 2

4

問題は、基本メソッドがabstract. から継承するクラスConcrete<T>オーバーライドする必要がありますBase.Execute()が、によって隠されているためオーバーライドできませんでしDerived<T>.Execute()た。したがって、(少なくとも C# では) 実装を持たない可能性がConcrete<T>あるクラスになるため、役に立たないでしょう。abstractそのため、C# コンパイラでは記述できません。

がインターフェイスの場合Base、明示的なインターフェイスの実装を使用してこれを回避できます。しかし、明示的な基本クラスの実装のようなものは何もないので、少なくとも 2 つのメソッドのいずれかの名前を変更しない限り、この種のコードを作成する方法はないと思います。

于 2016-09-07T17:00:13.837 に答える
1

MSDN から:

抽象メソッド宣言は新しい仮想メソッドを導入しますが、そのメソッドの実装は提供しません。代わりに、非抽象派生クラスは、そのメソッドをオーバーライドして独自の実装を提供する必要があります

このエラーの理由は、抽象化が C# でどのように機能するかです。抽象化は継承でき、実装できますが、非表示にしたり、別の抽象化に置き換えたりすることはできません。

さらに、コードを検討してください:

public abstract class Base
{
    public abstract Task Execute();
    public abstract Task<int> Execute();
}

次の理由により、これはコンパイルされません。

タイプ 'Base' は、同じパラメーター タイプを持つ 'Execute' というメンバーを既に定義しています

では、2 番目のメソッドを派生抽象クラスに移動すると、なぜ機能するのでしょうか?

于 2016-09-07T17:02:04.137 に答える