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.

我该怎么做?我尝试将 Door 类嵌套在 Car 类中,但它无法以这种方式访问​​ 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 的 setter 属性将 CAR 的颜色传递给 DOOR。

于 2010-02-18T22:35:01.023 回答
2

我认为门根本不应该与汽车有任何关系。该关系应该是模型作为关联 - “拥有”关系。汽车应该拥有车门,甚至在创建汽车时负责创建车门。门的构造函数应该接受一个参数来说明要创建什么颜色的门,例如 door = new Door(this.Colour); 其中“this”是对当前汽车对象的引用。如果您从逻辑上考虑,我可以将汽车颜色更改为蓝色,然后我的门颜色将随之更改。但是,如果我决定将车门颜色设为红色,则无需更改汽车颜色。

于 2010-02-18T23:20:06.107 回答
1

这实际上不是一个嵌套类,而是一个由 type 对象Door的属性引用的 type 对象Car。由于 C#(以及大多数其他面向对象的语言)中的引用本质上是单向的,因此您还需要在另一个方向上添加引用,以便能够执行您正在尝试的操作。

这是一种可能的实现:将构造函数添加到Door,接受对 aCar作为参数的引用。构造函数应该将引用保存在一个private readonly字段中。在GetColor()方法中,使用引用来获取实例color的。Car

然后,考虑将 替换GetColor()get-onlyCar属性Door。根据您真实课程中的关系(我假设您不是真正的汽车模型),这可能会或可能不会更可取。

于 2010-02-18T22:33:52.043 回答
0

如果您希望能够访问门类中 Car 的私有成员,则需要使用继承,如果您只想访问 Door 类中 Car 的公共成员,则可以使用 Composition

像这样:

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>在它的构造函数中使用 a 并且 Car 类可以通过它传递它的GetColor()方法:

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