如何创建一个可以访问创建它的类成员的嵌套类?

时间:2010-02-18 22:30:18

标签: c# class nested abstract inheritance

我在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继承门类或什么?

6 个答案:

答案 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)
        {
        }
    }
}