6

内部のクラスが次のインターフェイスにアクセスできるクラス ライブラリがあるとします。

interface myInterface
{
    string myProperty { get; set; } // notice setter.
}

しかし、誰かがこのクラス ライブラリをプロジェクトに追加すると、次のインターフェイスが得られます。

public interface myInterface
{
    string myProperty { get; }
}

これを行うための最も効率的で受け入れられている方法は何ですか? 1 つのインターフェイスで別のインターフェイスを実装しますか?

4

3 に答える 3

2

パブリック インターフェイスに getter だけを持たせます。

public interface myInterface
{
    string myProperty { get; } 
}

そして、セッターを持つ別の内部専用インターフェイスをそこから派生させます。

internal interface myInternalInterface : myInterface
{
    new string myProperty { get; set; }
}

内部インターフェースを実装できます。

class myImplementation : myInternalInterface
{
    public string myProperty{get; set;}
}

セッターを呼び出す必要がある場合は、インスタンスを内部インターフェイスにキャストして、その上で呼び出すことができます。ただし、このアプローチは少しデザイン臭がするので、慎重に使用してください。

于 2013-01-11T14:15:38.653 に答える
1

次のように、内部インターフェイスでパブリック インターフェイスを拡張できます。

public interface MyInternalInterface: MyPublicInterface
{
    string MyProperty { set; }
}

public interface MyPublicInterface
{
    string MyProperty { get; }
}

internal class A: MyInternalInterface
{
    public string MyProperty { get; set; }
}

public class Foo
{
    private A _a = new A();
    internal MyInternalInterface GetInternalA() { return _a; }
    public MyPublicInterface GetA() { return _a; }

}

この方法では、キャストなどは必要ありません。

于 2013-01-11T14:33:35.327 に答える
0

@adrianbanksの答えは私の改善かもしれないと思いましたが、実際には(気の利いたにもかかわらず)そうではないと思います-渡されるパブリックインターフェイスインスタンスが内部インスタンスも実装するという保証がないため-これこのソリューションにも当てはまります。また、実装型が次の場合にのみ機能するということもありますinternal。これは、パブリック型を標準インターフェイスの実装として、または階層のベースとして提供する場合には適していません。

これは私が使用するものです。与えられた:

interface myInterface
{
  string myProperty { get; set; }
}

public interface myPublicInterface
{
  string myProperty { get; }
}

まず、コンパイラが一貫性のないアクセシビリティについてうめき声を上げるため、継承を行うことはできません。したがって、プロパティバッカーを使用して内部のものを明示的に実装し、次にパブリックのものを暗黙的に実装できます。myPublicInterfacemyInterface

public class MyClass : myInterface, myPublicInterface
{
    private string _myProperty;

    string myInterface.myProperty
    {
        get { return _myProperty; }
        set { _myProperty = value; }
    }

    public string myProperty
    {
        get { return _myProperty; }
    }
}

注 - 場合によっては、getter はプライベート バッカーには適していない可能性がありますが、他のプロパティから値を計算するロジックである可能性があります。その場合-DRYに保つために-ロジックをパブリックゲッターに入れ、それを明示的なゲッターにリーチすることができます:

string myInterface.myProperty
{
  get { return MyProperty; }
  set { /*whatever logic you need to set the value*/ }
}

public string myProperty
{
  get { /*whatever complex logic is used to get the value*/ }
}

逆の方法で行うこともできますが、内部インターフェイスへの見栄えの悪いインライン キャストを行う必要があります。

string myInterface.myProperty
{
  get { /*whatever complex logic is used to get the value*/ }
  set { /*whatever logic you need to set the value*/ }
}

public string myProperty
{
  get { return ((myInterface)this).myProperty; }
}

可能な限り避けてください。

于 2013-01-11T14:11:41.360 に答える