c# - 面向对象设计父子关系

标签 c# oop

这是一个关于创建与对象的父/子关系的一般最佳实践问题。

假设我有 Wheel 和 Car 对象,我想将 Wheel 对象添加到 car 对象

public class Car{

    private List<Wheel> wheels = new List<Wheel>();

    void AddWheel ( Wheel WheelToAdd)
        {
            wheels.Add(WheelToAdd)
            //Some Other logic relating to adding wheels here
        }
    }
}

到目前为止一切顺利。但是,如果我想让我的车轮有一个 Car 属性来说明它与哪辆父车相关怎么办。像这样

 public class Wheel {

     private Car parentCar;
     public Car 
     {
        get
        {
         return parentCar
        }

  }

}

将轮子添加到汽车时,您会在什么时候设置轮子的父属性?您可以在 Car.AddWheel 方法中设置它,但 Wheel 对象的 Car 属性必须是读/写,然后您可以在 AddWheel 方法之外设置它,从而造成不一致。

任何想法,非常感谢

最佳答案

更好的设计方法,(领域驱动设计)规定你应该首先决定这些实体的领域模型要求是什么......并不是所有的实体都需要独立访问,如果 Wheel属于这一类,它的每个实例都将始终是 Car 对象的子成员,您不需要在其上放置 Parent 属性... Car成为所谓的根实体,访问Wheel 的唯一方法是通过Car 对象。

即使 Wheel 对象需要独立访问,域模型要求也应该告诉您使用模式需要什么。任何 Wheel 是否会在没有父对象的情况下作为单独的对象传递?在那些情况下,Car 父项是否相关?如果父 Car 的身份与某些功能相关,为什么不简单地将完整的复合 Car 对象传递给该功能方法还是模块?必须单独传递包含的复合对象(如 Wheel),但需要和/或相关父对象(它所属的对象)的身份的情况实际上不是一个常见的场景,并且使用上述类型的分析来接近您的设计可以避免您向系统添加不必要的代码。

关于c# - 面向对象设计父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3875021/

相关文章:

c# - 如何将 C# 控制台应用程序部署为单个 exe?

c# - 命令行应用程序无法通过计划任务发送电子邮件

c# - 如何使用 ASCII 数据分配一个字符?

php - 如何在PHP OOP中朗读 "->"或 "::"登录?

c# - 使用 WMI 查询获取挂载点的相应物理磁盘驱动器?

c# - 字符串插值 - 重复

javascript - JavaScript 中的原型(prototype)继承是否表现出类型多态性?

javascript - 如何在javascript中构建关系结构?

java - 如何使用 void 方法确保良好的测试覆盖率

java - 通过反射构造对象时如何传递各种参数?