我在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继承门类或什么?
答案 0 :(得分: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; }
}
}
答案 1 :(得分:2)
这通常不是你想要在设计良好的对象模型中做的事情。
DOOR是CAR对象的一个组件,但不应该依赖于CAR对象。您应该通过构造函数或DOOR的setter属性将CAR的颜色传递到DOOR。
答案 2 :(得分:2)
我不认为门应该对汽车有任何参考。这种关系应该是模型作为一种关联 - “拥有”关系。汽车应该拥有车门,甚至负责在汽车制造时创造车门。门的构造者应该参考一个参数来说明什么颜色的门创造如门=新门(this.Colour);其中'this'是对当前汽车对象的引用。如果你从逻辑上考虑它,我可以将汽车颜色改为蓝色,我的车门颜色也会随之改变。但是,如果我决定让车门颜色为红色,则车辆颜色不必改变。
答案 3 :(得分:1)
这实际上不是嵌套类,而是类型为Door
的对象上的属性引用的Car
类型的对象。由于引用在C#(以及大多数其他面向对象的语言)中本质上是单向的,因此您还需要在另一个方向上添加引用,以便能够执行正在尝试的内容。
以下是一种可能的实现:向Door
添加构造函数,接受对Car
作为参数的引用。构造函数应将引用保存在private readonly
字段中。在GetColor()
方法中,使用引用获取color
实例的Car
。
然后,考虑将GetColor()
替换为get
上仅Car
的{{1}}属性。根据您真实班级中的关系(我假设您不是真正的汽车模型),这可能会或可能不会更好。
答案 4 :(得分:0)
如果你想在门类中访问Car的私人成员你需要使用继承,如果你只想访问Door类中Car的公共成员你可以使用Composition
像这样:
public class Car
{
public string Color;
}
public class Door
{
public string T;
public Car C;
}
虽然这不是一个合乎逻辑的方法。应该是Car类中有一个Door属性。
答案 5 :(得分:0)
我会让Door类在其构造函数中使用Func<Color>
,而Car类可以通过它传递GetColor()
方法:
public class Car
{
private class Door
{
public Door(Func<Color> getColourFunc)
{
}
}
}