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

本文关键字:嵌套类型 组合 创建部 关系 为什么 | 更新日期: 2023-09-27 18:32:35

在创建部分关系时使用嵌套类型(而不是使用该类类型的变量/字段数据(有什么好处(示例引擎是 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);
      }
    .......
}

(二(

public class Car
{
   public class Engine
    {
       . . . 
    }
}

然后你可以做一些类似的事情

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

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

我会

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

你可以说也许使用命名空间仍然会更好;毕竟,如果你把Engine类放在namespace CarsAreCool.Car内,你仍然可以通过Car.Engine引用对象,但这实际上与Car类上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
}

当对象应该具有一些额外的功能并且您不想在对象本身中实现它时,将使用嵌套类型。并不总是需要使用它。例:考虑您正在创建一辆游戏赛车。因此,汽车需要有轮胎、发动机和车身。虽然发动机可以有涡轮增压器,也可以没有。没有必要为涡轮增压器配备容器。这里的涡轮增压器为汽车的发动机增加了一些额外的功能。

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
{
}