2009-05-11 10 views
13

属性とgetter/setterを持つクラスInnerClassがあるとします。 InnerClassを含むOuterClassクラスもあります。クラスCのクラスのゲッターとセッター#

class InnerClass 
{ 
    private int m_a; 
    private int m_b; 

    public int M_A 
    { 
     get 
     { 
      return m_a; 
     } 
     set 
     { 
      m_a = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 
} 

OuterClassのinnerClassメンバー用に正しいゲッターとセッターを実装するにはどうすればよいですか?

ありがとうございます!

+0

"set"は{m_a = value;} –

+0

あなたが知っているように担当者を持っている必要があります;) – annakata

答えて

24

構文は同じではありません。あなたは.NET 3.5のC#を使用している場合、あなたが持っているすべてがちょうど裏に読み取りと書き込みの単純なプロパティである場合だけで...ところで

public InnerClass InnerClass 
{ 
    get { return innerClass; } 
    set { innerClass = value; } 
} 

、あなたは自動プロパティ生成機能を使用することができます店舗(上記のように)。 sytaxは抽象プロパティと同様である:

public InnerClass InnerClass { get; set; } 

これは自動的にストレージのためのプライベートメンバを生成し、その後、getで、そこから読み込み、setでそれに書き込みます。

2
public InnerClass InnerClass 
    { 
     get 
     { 
      return innerClass; 
     } 
     set 
     { 
      innerClass = value; 
     } 
    } 
0

内部クラスの仕組みによって異なります。外側のクラスが「自分」内部クラス、その場合に必要になる場合があります。それをこのようにすることで

public InnerClass InnerClass{ 
    get{ return innerClass; } 
    set{ innerClass.CopyFrom(value); /* Pseudo method call */ } 
} 

、あなたはOuterClassていない限り、明示的にインスタンスを操作するから外部コードを防ぐ。..

+0

ゲッターでインスタンスを返すので、実際はそうではありません。これを行う唯一の実際の方法(そしてこのアプローチはやや臭いです...)は、同じCopyFromメソッドを使用してゲッターで新しいインスタンスを返すことです。 –

+0

私はあなたが誤解していると思います。要点は、インスタンスを変更することができますが、OuterClassのインスタンスを通じて明示的に行う必要があることです。例 OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_Aは1と等しい。 foo.SomeProperty = 2; // outerInstance.InnerClass.M_Aはまだ1と等しい outerInstance。InnerClass = foo; //outerInstance.InnerClass.M_Aは2と同じです – James

0

あなたの場合内部クラス自体を公開せずに内部クラスメンバにアクセスすることを意味します。次のコードを使用できます。 this.innerClassを公開したいだけなら、InnerClassのフィールドを公開する方法に違いはありません。

class InnerClass 
{ 
    private int _a; 
    public int a 
    { 
     get 
     { 
      return _a; 
     } 
     set 
     { 
      _a = value; 
     } 
    } 

    private int _b; 
    public int b 
    { 
     get 
     { 
      return _b; 
     } 
     set 
     { 
      _b = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass _innerClass; 
    public InnerClass innerClass 
    { 
     get 
     { 
      return _innerClass; 
     } 
     set 
     { 
      _innerClass = value; 
     } 
    } 
} 

これら二つの定義は、暗黙的に同じです。これは、暗黙的に同じである

class InnerClass 
{ 
    public int a{ get; set; } 
    public int b{ get; set; } 
} 

class OuterClass 
{ 
    public InnerClass innerClass{ get; set; } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 

    public int M_A 
    { 
     get 
     { 
      if (this.innerClass != null) 
      { 
       return this.innerClass.M_A; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     set 
     { 
      if (this.innerClass != null) 
      { 
       this.innerClass.M_A = value; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 
} 
+0

私は質問の一部を見落とさない限り、これがどのように当てはまるのか分かりません...彼が求めていたものですか? –

+0

ちょっと不思議なことに、ゲッターに無効な演算例外がスローされるのはなぜですか?なぜ私はあなたがセッターでこれをするのか理解していますが、ゲッターが通常は受動的であるとは思わないでしょうか? – BenAlabaster

+0

私は「[...] getterとsetterをOuterClassのinnerClassメンバの質問に読みましたか?追加の "s"を "OuterClassの[...] innerClass memberS"としましたが、私の答えを終えた後にのみそれを再調整しました。 –

21

これを行うための最もエレガントな方法は、暗黙的なゲッターとセッターを使用することです - かなりのキーストロークを差し引いたものです。最初の例では、コンパイラは必要なプライベートフィールドをバックグラウンドで実装するので、必要はありません。 2番目は、何が起こっているのかをより詳細に制御できます。

+0

+1暗黙のゲッターとセッターの場合 – BobTheBuilder

+2

...これは私の答えとどう違うのですか? –

+1

また、彼は彼が使用しているC#/ .NETのバージョンを知らせていません。暗黙のプロパティは、.NET 3.5/C#3.0の一部です。 –