3

私はC#でこのクラス/インターフェース定義を持っています

public class FooBase {
    ...
    protected bool Bar() { ... }
    ...
}

public interface IBar {
    bool Bar();
}

次に、IBar を実装する FooBase から派生したクラス Foo1 を作成します。

public class Foo1 : FooBase, IBar {
}

コンパイラが継承された保護されたメソッドを、公開されているアクセス可能なインターフェイスの実装として受け取るクラス宣言の魔法はありますか?

もちろん、Foo1 メソッド

bool IBar.Bar()
{
    return base.Bar();
}

動作します。ショートカットがあるかどうかだけ知りたいです;)

このメソッドを省略すると、コンパイラ エラーが発生します。Foo1 はインターフェイス メンバ IBar.Bar() を実装していません。FooBase.Bar() が static であるか public でないか、戻り値の型が間違っています。

説明: コードの継承 (クラス階層) と機能の実装 (インターフェース) を分離します。したがって、同じインターフェイスを実装するクラスの場合、共有 (継承) コードにアクセスすると非常に便利です。

4

3 に答える 3

6

ショートカットはありません。実際、このパターンは私が見たいくつかの場所で使用されています (必ずしも であるとは限りませんICollectionが、アイデアはわかります)。

public class Foo : ICollection
{
    protected abstract int Count
    {
        get;
    }

    int ICollection.Count
    {
        get
        {
            return Count;
        }
    }
}
于 2009-08-08T19:23:55.237 に答える
1

あなたのコードは可能な限り短いと思います。そこに近道があるとは思わないでください。

于 2009-08-08T19:20:13.793 に答える
1

プロテクト メンバーFooBase.Bar()は、インターフェイスIBarの実装メソッドではありません。このインターフェースは public Method Bar()を必要とします。

インターフェイスを実装する方法は 2 つあります。明示的な実装または暗黙的な実装。

以下は明示的な実装です。このメソッドは、Foo のオブジェクトが IBar 変数を介して呼び出された場合に呼び出されます。

bool IBar.Bar() 
{
    return base.Bar();
}

public メソッド Bar() の定義は、暗黙的な実装です。

コンパイラを満足させるには、基本クラスのメソッドを public としてオーバーライドまたは新規作成する必要があります (メソッドが基本クラスで保護されている場合は、適切なアドバイスではありません)。

new public bool Bar() 
{
    return base.Bar();
}

秘訣は、インターフェイスを実装することですが、すべてのインターフェイス メンバーをクラスのパブリック メンバーとして持つわけではありません。

于 2009-08-08T20:10:04.737 に答える