属性とゲッター/セッターを持つクラスInnerClassがあると仮定します。 InnerClassを含むOuterClassクラスもあります。
例えば.
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メンバーの正しいゲッターとセッターをどのように実装しますか?
前もって感謝します!
構文に違いはありません。ただ...
public InnerClass InnerClass
{
get { return innerClass; }
set { innerClass = value; }
}
ちなみに、.NET 3.5でC#を使用している場合、(上記のように)バッキングストアに対して読み取りと書き込みを行うだけの単純なプロパティがあれば、自動プロパティ生成機能を使用できます。構文は抽象プロパティの構文に似ています。
public InnerClass InnerClass { get; set; }
これにより、ストレージ用のプライベートメンバーが自動的に生成され、get
内のメンバーから読み取られ、set
内のメンバーに書き込まれます。
これを行う最もエレガントな方法は、暗黙的なゲッターとセッターを使用することです。
class InnerClass
{
public int a{ get; set; }
public int b{ get; set; }
}
class OuterClass
{
public InnerClass innerClass{ get; set; }
}
これは暗黙的に次と同じです。
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;
}
}
}
これら2つの定義は暗黙的に同じです-かなりの数のキーストロークを除いて。最初の例では、コンパイラーが必要なプライベートフィールドをバックグラウンドで実装するため、その必要はありません。ただし、2番目の方法では、何が起こっているかをより詳細に制御できます。
public InnerClass InnerClass
{
get
{
return innerClass;
}
set
{
innerClass = value;
}
}
内部クラスがどのように機能するかによります。外部クラスは内部クラスを「所有」する必要があるかもしれません。その場合、
public InnerClass InnerClass{
get{ return innerClass; }
set{ innerClass.CopyFrom(value); /* Pseudo method call */ }
}
このようにすることで、OuterClassを介して明示的に指定しない限り、外部コードがインスタンスを操作するのを防ぐことができます。
内部クラス自体を公開せずに内部クラスメンバーにアクセスする場合は、次のコードを使用できます。あなただけを公開したい場合this.innerClass
、InnerClass
のフィールドを公開する方法に違いはありません。
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();
}
}
}
}