Как вы делаете вложенный класс, который может получить доступ к членам класса, который его создал? - PullRequest
3 голосов
/ 19 февраля 2010

Я программирую на 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.

Как мне это сделать? Я попытался вложить класс Door в класс Car, но он не может получить доступ к членам класса Car таким образом. Нужно ли заставить машину наследовать класс дверей или что-то в этом роде?

Ответы [ 6 ]

5 голосов
/ 19 февраля 2010

Самый простой способ - вернуть типу 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; }
  }
}
2 голосов
/ 19 февраля 2010

Я не думаю, что дверь вообще должна иметь какое-либо отношение к машине. Отношения должны быть моделью как ассоциация - «владеет» отношениями. Автомобиль должен иметь автомобильную дверь и даже отвечать за создание дверей при создании автомобиля. Конструктор двери должен принять параметр, чтобы сказать, какой цвет двери создать, например, door = new Door (this.Colour); при этом «this» является ссылкой на текущий объект автомобиля. Если вы подумаете об этом логически, я могу изменить цвет машины на синий, и цвет моей двери изменится вместе с этим. Однако, если я решил сделать цвет дверей (-ей) красным, необязательно менять цвет автомобиля.

2 голосов
/ 19 февраля 2010

Обычно это не то, что вы хотели бы делать в хорошо спроектированной объектной модели.

DOOR является компонентом объекта CAR, но не должен зависеть от объекта CAR. Вы должны передать цвет АВТОМОБИЛЯ в ДВЕРЬ либо через конструктор, либо через свойство сеттера ДВЕРИ.

1 голос
/ 19 февраля 2010

Это на самом деле не вложенный класс, а объект типа Door, на который ссылается свойство объекта типа Car. Поскольку ссылки по своей природе односторонние в C # (и большинстве других объектно-ориентированных языков), вам нужно будет добавить ссылку и в другом направлении, чтобы иметь возможность делать то, что пытаются.

Вот одна из возможных реализаций: добавить конструктор к Door, приняв ссылку на Car в качестве параметра. Конструктор должен сохранить ссылку в поле private readonly. В методе GetColor() используйте ссылку, чтобы получить color экземпляра Car.

Затем рассмотрите возможность замены GetColor() get -только Car свойством на Door. В зависимости от отношений в ваших реальных классах (я предполагаю, что вы на самом деле не моделируете автомобили), это может быть или не быть предпочтительным.

0 голосов
/ 19 февраля 2010

Я бы заставил класс Door принять Func<Color> в своем конструкторе, а класс Car может передать свой метод GetColor() через это:

public class Car
{
    private class Door
    {
        public Door(Func<Color> getColourFunc)
        {
        }
    }
}
0 голосов
/ 19 февраля 2010

Если вы хотите иметь доступ к закрытым членам Car в классе door, вам нужно использовать наследование, если вы просто хотите получить доступ к открытым членам Car внутри класса Door, вы можете использовать Composition

Как это:

public class Car
    {
        public string Color;
    }

    public class Door
    {
        public string T;

        public Car C;
    }

Хотя это не совсем логичный подход. Должно быть, внутри класса Car есть свойство Door.

...