C# · 12月 28, 2021

c# – 多重继承?

我已经看了一下可以帮助我解决令我困惑的设计问题的信息.我是新来的复杂的继承情况,所以我的解决方案实际上可以植根于一个更好的设计.但是,为了弄清楚我的设计应该是什么,我一直在想,我真的只需要继承一个以上的基础类.

我的具体案例涉及资产和不同类型的资产.

从资产开始…

每个PhysicalDevice都是资产
每个VirtualDevice都是资产
每个服务器都是资产

每个PhysicalServer都需要同时具备PhysicalDevice和Server
每个VirtualServer都需要是VirtualDevice和Server
每个NetDevice都是一个PhysicalDevice
每个StorageArray都是一个PhysicalDevice

我想的一个解决方案是复制两个PhysicalServers和VirtualServers的服务器代码,但是,我觉得这是反对我试图做的,这是继承.

它们需要是单独的类,因为每个类都具有属性和方法.例如,Server将具有OSCaption,Memory,Procs等.PhysicalDevice将具有位置,串行,供应商等等,VirtualDevice将具有ParentDevice,State,VHDLocation等.

如果继承是衬垫,那么我遇到无法准确描述这些类型的问题.

有趣的是接口.似乎我可以将所有基类定义为接口,并根据需要在我的主类中实现它们.但是,如果我这样做,我根本就不确定这个含义是什么.

例如,像…的物理服务器:IAsset:IServer:IPhysical

我在深水中,所以我真的只是寻找建议或指导.

解决方法 接口是确保各种类型之间的合同完整性的适当方式,但是可能会导致每个实现的重复代码.

您的情景可能更适合组合而不是继承(或其组合).

示例 – 继承组合

public class PhysicalServer : Asset{ public PhysicalInfo PhysicalProperties { get; set; }}public class VirtualServer : Asset{ public VirtualInfo VirtualProperties { get; set; }}

示例 – 仅组合

public class VirtualServer{ public VirtualInfo VirtualProperties { get; set; } public AssetInfo AssetProperties { get; set; }}

然后,您可以在混合中添加多态/泛型,并创建类型的衍生物来表示更具体的需求.

示例 – 继承组合从通用类型继承的通用成员

public class VirtualServer<TVirtualInfo> : Asset where TVirtualInfo : VirtualDeviceInfo{ public TVirtualInfo VirtualProperties { get; set; }}public class VirtualServerInfo : VirtualDeviceInfo{ // properties which are specific to virtual servers,not just devices}

有无数的方法可以建模,但配备接口,组合,继承和泛型,你可以想出一个有效的数据模型.