17

属性とゲッター/セッターを持つクラス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メンバーに正しいゲッターとセッターを実装するにはどうすればよいですか?

前もって感謝します!

4

5 に答える 5

27

構文に違いはありません。ただ...

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

ちなみに、.NET 3.5でC#を使用している場合、(上記のように)バッキングストアに対して読み取りと書き込みを行うだけの単純なプロパティがあれば、自動プロパティ生成機能を使用できます。構文は、抽象プロパティの構文に似ています。

public InnerClass InnerClass { get; set; }

これにより、ストレージ用のプライベートメンバーが自動的に生成され、から読み取り、get書き込みが行われsetます。

于 2009-05-11T12:40:09.253 に答える
22

これを行う最もエレガントな方法は、暗黙的なゲッターとセッターを使用することです。

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 番目の方法では、何が起こっているかをより詳細に制御できます。

于 2009-05-11T12:57:13.753 に答える
2
public InnerClass InnerClass
    {
        get
        {
             return innerClass;
        }
        set
        {
             innerClass = value;
        }
     }
于 2009-05-11T12:40:47.193 に答える
0

これは、内部クラスがどのように機能するかによって異なります。外部クラスは内部クラスを「所有」する必要がある場合があります。その場合、次のようになります。

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

このようにすることで、OuterClassを明示的に経由しない限り、外部コードがインスタンスを操作するのを防ぐことができます。

于 2009-05-11T12:45:32.593 に答える
0

内部クラス自体を公開せずに内部クラスのメンバーにアクセスする場合は、次のコードを使用できます。を公​​開したいだけの場合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();
            }
        }
    }
}
于 2009-05-11T12:46:10.893 に答える