为啥在创建部分关系(组合)时使用嵌套类型
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;
Car
、Truck
、Van
、Motorcycle
等都会实现这一点,因为它是一种车辆。现在以Motorcycle
类为例。头盔是摩托车特有的东西,它们本身也有一些属性,所以拥有HelmetColor
、HelmetSize
、HelmetVisorType
关闭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
【讨论】:
以上是关于为啥在创建部分关系(组合)时使用嵌套类型的主要内容,如果未能解决你的问题,请参考以下文章