为啥在创建部分关系(组合)时使用嵌套类型

Posted

技术标签:

【中文标题】为啥在创建部分关系(组合)时使用嵌套类型【英文标题】:Why use Nested types while creating part-of relationship (composition)为什么在创建部分关系(组合)时使用嵌套类型 【发布时间】:2016-01-31 18:16:31 【问题描述】:

在创建部分关系时使用嵌套类型(而不是使用该类类型的变量/字段数据)有什么好处(示例引擎是 Car 的一部分) 换句话说,以下之间有什么区别: (1)

public class Engine

//some attributes like engine type and constructor
 . . . 

public class Car

    Engine e;
    Public Car(string type)
      
          e = new Engine(type);
      
    .......

还有

(2)

public class Car

   public class Engine
    
       . . . 
    

然后你可以做类似的事情

Car.Engine e;
e = new Car.Engine();
e.type = something;

【问题讨论】:

Prefer composition over inheritance?的可能重复 没有特别的好处。只是通过名称引用该类的另一种方式。 @Viru 这不是该线程的副本。 OP 在这里询问嵌套类型是否有任何优势。 Why Would I Ever Need to Use C# Nested Classes的可能重复 虽然这显然是可能的,但我正在努力思考一个问题,我找到了一种将公共嵌套类型定义为解决方案的模式。例如,如果您在查看用例时眯起眼睛,那么您几乎是在重新发明命名空间通常有什么用处。在这里查看@Eric Lippert 的答案:***.com/questions/7984529/… 【参考方案1】:

我会说嵌套类型的使用是为了组织和特殊性。像您的示例中这样的嵌套类的问题是 Engine 是所有类型车辆的必要对象,因此将其嵌套在特定车辆中是没有意义的。

你可以说也许使用命名空间会更好;毕竟,如果您将Engine 类放在namespace CarsAreCool.Car 中,您仍然可以通过Car.Engine 引用该对象,但这实际上与Engine 类上的Engine 类型的公开属性没有什么不同。

所以这里是我认为它有用的地方:

假设我们有一个接口IVehicle,我们的所有车辆都实现了该接口,以及与车辆相关的其他通用类。

public interface IVehicle 

    public Engine Engine;
    public int PassengerCapacity;
    public int NumberOfWheels;

CarTruckVanMotorcycle 等都会实现这一点,因为它是一种车辆。现在以Motorcycle 类为例。头盔是摩托车特有的东西,它们本身也有一些属性,所以拥有HelmetColorHelmetSizeHelmetVisorType 关闭Motorcycle 的属性会有点乏味,不是吗?这些显然是Helmet 类的属性。因此,您可以嵌套该类,这样只有在谈到摩托车时才能访问它,并且它允许您以更清晰的方式组织属性。

public class Motorcycle : IVehicle

    #region IVehicle implementation 

    #endregion

    #region Nested Types

    public sealed class Helmet
    
        public string Color;
        public string Size;
        public string VisorType;
        public bool RequiredByLaw;
    

    public Helmet Helmet;
    public decimal Mileage;

    #endregion

【讨论】:

【参考方案2】:

当对象应该具有一些额外的功能并且您不想在对象本身中实现它时,使用嵌套类型。并不总是需要使用它。例子: 假设您正在创建一辆游戏赛车。所以,汽车需要有轮胎、发动机和车身。 而发动机可以有或没有涡轮。不需要为 Turbo 提供容器。这里的涡轮增压器为汽车的引擎增加了一些额外的功能。

public class Car
 
     public Engine Engine;
     public List<Tire> Tires;

public class Engine

     public string Type;
     public string Cylinder;
     public class Turbo
     
          public string Name;
          public string Power;
          public void CalculatePower()
          
          
     

public class Tire


【讨论】:

以上是关于为啥在创建部分关系(组合)时使用嵌套类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥嵌套类型的范围不包括派生类?

为啥在使用嵌套查询时不能引用用户定义的类型字段?

js代码嵌套问题,为啥外层定义的变量内层不能使用

Java中的静态嵌套类,为啥?

嵌套类和接口

为啥我的 graphql 嵌套查询返回 null?