Classは、型が別のインタフェースであるインタフェースのプロパティを実装します。下のコードから、 `Property2`、` Property3`

N名前空間には2つのインターフェースIAとIBがあります。タイプIBのIAリターンのプロパティの1つ

namespace N    
    {
        Interface IA
        {
           //Have a property Property1 which returns of type IB(interface type)
            IB Property1 { get; } 
        }

        interface IB
        {
            int Property2 { get; }
            int Property3 { get; }        
        }
    }

N2は、クラスAがIAを実装する別の名前空間です。このクラスのコードでは、IB型のProperti1の値を返さなければなりません。私のクラスはIBを実装すべきか

   using N;
            namespace N2
            {
                class A : IA
                {
                    IB property1;
                    IB Property1 { get { return property1; } }
                }
            }
2
これはすべて、プロパティ値を制御する A 、プロパティ値を制御する BI の実装、または BI プロパティの値を制御する A 私たちにあなたが何をしているかをもっと知ることができるように、私たちに教えてください。
追加された 著者 Lukazoid,
また、インターフェイスの命名規則はマイクロソフト社のものですが、ここを参照してください。これは ISomething の形式にする必要があります。
追加された 著者 Lukazoid,
私はクラスでProperty1を実装する方法を知りたい。 Property1の値を取得しようとするユーザーは、Property2、Property3の値をどのように取得しますか。どこでBIを実装すべきか、B1の特性
追加された 著者 myWorld,

4 答え

インターフェイスに指定されていない場合でも、実装にセッターを追加できます。

class A : AI
{
    BI property1;
    BI Propert1 { 
      get { return property1; } 
      set { property1 = value; }
    }
}

または

class A : AI
{
    BI Propert1 { get; set; }
}
1
追加された
AIはパブリックなので、私のクラスだけが値を設定する必要があるので、私はクラスにセッターを追加することはできません。私のクラスのユーザーは、インターフェイスへのアクセス権を持ち、ユーザーは値を設定する機会を与えてはいけません。
追加された 著者 myWorld,

BI の実装が必要です。

using N; 
namespace N2 {     
    class A : AI     
    {         

         BI Property1 
         { 
              get 
              { 
                   return new B(){Property1 = 5,Property2=100 };
              } 
         }     
    } 


    class B : BI
    {
         int Property1 {get;set;}
         int Property2 {get;set;}
    }
} 
0
追加された
BIをセッターに変えることを意味しますか?ユーザーはAIやBIのプロパティの値だけを読み上げるべきですが、それらのプロパティの値は読み取るべきではありません。私のクラスだけがAIやBIのプロパティの値を設定する必要があります
追加された 著者 myWorld,

インターフェイス BI のプロパティから返される値を返すために AI インターフェイスを使用する場合は、デザインを再考する必要があると思います。私はこれを言うが、他のオブジェクトへのアクセスを単に提供するのではなく、あるオブジェクトが他のオブジェクトのメンバーに直接アクセスできるようにすることは悪い習慣である(ほとんどの場合)。

しかし、あなたのコード例では、これをしようとしているようには見えません(私は質問と例の組み合わせによって少し混乱しています)。インターフェイスのプロパティから返される値を設定する方法を知りたい場合は、いくつかのセッター関数を提供するか、クラスコンストラクターを使用して初期化する必要があります。

セッタープロパティ

プロパティを次のように変更します。     int Property2 {get;セット; }

セッターメソッド

インターフェイスまたはクラスにセッターメソッドを追加する:     public void SetProperty2(int value){}

コンストラクタ

BI (おそらく B )インターフェイスを実装するクラスにコンストラクタを追加します。

public class B : BI
{
    private int mProperty2;

    public B(int property2)
    {
        mProperty2 = property2;
    }

    public int Property2
    {
        get { return mProperty2; }
    }
}
0
追加された
@ starz26答えを受け入れて、あなたが役に立つと思った答えを投票してください。
追加された 著者 Samuel Slade,
@ starz26オリジナルの質問を編集してこの問題を反映させ、さらに詳しく説明できますか?
追加された 著者 Samuel Slade,
私はこのアプローチが私を助けると思う。インターフェイスは私に与えられ、私はあなたのクラスを構築する必要があります。私はインターフェイスを使用するために私の実装を執筆する以外のインターフェイスには何もできません
追加された 著者 myWorld,
これには問題があります。テストアプリからクラスAをテストすると、クラスBが毎回2回インスタンス化されていることがわかります。これはProperty1.Property2とProperty1.Property2を読み込んだときです
追加された 著者 myWorld,

BIインターフェイスを実装する必要があり、そのクラスをProperty1に使用できます。

using N;
namespace N2
{
    class A : AI
    {
        BI property1;
        BI Property1 { get { return property1; } }

        public A() 
        {
            property1 = new B();
        }
    }

    class B : BI
    {
        int Property2 { get { return 2; } }
        int Property3 { get { return 3; } }
    }
}
0
追加された