3

C#.NETでプログラミングしています。それを作成したインスタンスのメンバーにアクセスできるネストされたクラスを作成したいのですが、方法がわかりません。

これは私がやりたいことです:

Car x = new Car()
x.color = "red";
x.Door frontDoor = new x.Door();
MessageBox.Show(frontDoor.GetColor());    // So I want the method GetColor of the class Front Door to be able to access the color field/property of the Car instance that created it.

どうすればいいのですか?Car クラス内に Door クラスをネストしようとしましたが、そのように Car クラスのメンバーにアクセスできません。Car にドアクラスなどを継承させる必要がありますか?

4

6 に答える 6

5

最も簡単な方法は、型を作成した Doorへの参照を型に与えることです。Car

例えば:

class Car { 
  public string color;
  public Door Door() { return new Door(this); }
  class Door { 
    Car owner;
    Door(Car owner) { this.owner = owner; }
    string GetColor() { return owner.color; }
  }
}
于 2010-02-18T22:33:28.377 に答える
2

これは、通常、適切に設計されたオブジェクト モデルで実行したいことではありません。

DOOR は CAR オブジェクトのコンポーネントですが、CAR オブジェクトに依存するべきではありません。コンストラクターまたは DOOR のセッター プロパティを介して、CAR の色を DOOR に渡す必要があります。

于 2010-02-18T22:35:01.023 に答える
2

ドアに車への言及があるべきではないと思います。関係は、関連付けとしてのモデルである必要があります-「所有する」関係。車は車のドアを所有する必要があり、車の作成時にドアの作成も担当する必要があります。ドアのコンストラクターは、作成するドアの色を指定するパラメーターを受け取る必要があります。例: door = new Door(this.Colour); 'this' は現在の車のオブジェクトへの参照です。論理的に考えると、車の色を青色に変更でき、それに伴ってドアの色も変更されます。ただし、ドアの色を赤にすることにした場合、車の色を変更する必要はありません。

于 2010-02-18T23:20:06.107 に答える
1

これは実際にはネストされたクラスではなく、 typeDoorのオブジェクトのプロパティによって参照されるtype のオブジェクトですCar。C# (および他のほとんどのオブジェクト指向言語) では参照は本質的に一方向であるため、目的を実行できるようにするには、反対方向にも参照を追加する必要があります。

考えられる実装の 1 つを次に示します。コンストラクターを に追加し、パラメーターとしてDoorへの参照を受け入れCarます。private readonlyコンストラクターは参照をフィールドに保存する必要があります。GetColor()メソッドでは、参照を使用してインスタンスの を取得しcolorますCar

次に、GetColor()を の のみのプロパティに置き換えることをget検討CarしてくださいDoor。実際のクラスでの関係に応じて (実際に車をモデル化しているわけではないと思います)、これが望ましい場合とそうでない場合があります。

于 2010-02-18T22:33:52.043 に答える
0

ドア クラスの Car のプライベート メンバーにアクセスできるようにする場合は、継承を使用する必要があります。ドア クラス内の Car のパブリック メンバーにアクセスするだけの場合は、コンポジションを使用できます。

このような:

public class Car
    {
        public string Color;
    }

    public class Door
    {
        public string T;

        public Car C;
    }

これは実際には論理的なアプローチではありませんが。Car クラス内に Door プロパティがあるはずです。

于 2010-02-18T22:36:51.520 に答える
0

Door クラスがFunc<Color>そのコンストラクターで を取得するようにすると、Car クラスはそれGetColor()を介してそのメソッドを渡すことができます。

public class Car
{
    private class Door
    {
        public Door(Func<Color> getColourFunc)
        {
        }
    }
}
于 2010-02-18T22:40:38.100 に答える