我已经看了一下可以帮助我解决令我困惑的设计问题的信息.我是新来的复杂的继承情况,所以我的解决方案实际上可以植根于一个更好的设计.但是,为了弄清楚我的设计应该是什么,我一直在想,我真的只需要继承一个以上的基础类.
我的具体案例涉及资产和不同类型的资产.
从资产开始…
每个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 }
有无数的方法可以建模,但配备接口,组合,继承和泛型,你可以想出一个有效的数据模型.