jwr*_*ail 9 c# inheritance interface class multiple-inheritance
我已经在网上寻找可以帮助我解决令我困惑的设计问题的信息.我是复杂的继承情况的新手,所以我的解决方案实际上只能植根于更好的设计中.但是在试图找出我的设计应该是什么时,我一直认为我真的只需要继承超过1个基类.
我的具体案例涉及资产和不同类型的资产.
从资产开始......
每个PhysicalDevice都是一个资产
每个VirtualDevice都是一个资产
每个服务器都是一个资产
每个PhysicalServer都需要同时是PhysicalDevice和Server
每个VirtualServer都需要同时是VirtualDevice和Server
每个NetDevice都是PhysicalDevice
每个StorageArray都是一个PhysicalDevice
我想的一个解决方案是复制PhysicalServers和VirtualServers的服务器代码,但是,我觉得这与我试图做的事情相违背,这是继承.
它们需要是单独的类,因为每个类型都有属性和方法.例如,服务器将有OSCaption,内存,特效等PhysicalDevice会之类的位置,串口,供应商等,并VirtualDevice将有ParentDevice,国家,VHDLocation等.
如果继承是衬垫,那么我遇到了无法准确描述这些类型的问题.
看似有趣的东西是Interfaces.似乎我可以将所有基类定义为接口,并根据需要在我的主类中实现它们.但是,我只是不确定如果我这样做会产生什么影响.
例如,像...... 物理服务器:IAsset:IServer:IPhysical
我在深水中,所以我只是在寻找建议或指导.
接口是确保跨类型的合同完整性的适当方式,但最终可能会为每个实现提供重复的代码.
您的场景可能更适合于合成而不是继承(或其组合).
示例 - 继承+组合
public class PhysicalServer : Asset
{
public PhysicalInfo PhysicalProperties
{
get;
set;
}
}
public class VirtualServer : Asset
{
public VirtualInfo VirtualProperties
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
示例 - 仅限构图
public class VirtualServer
{
public VirtualInfo VirtualProperties
{
get;
set;
}
public AssetInfo AssetProperties
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将多态/泛型添加到组合中,并创建类型的派生词以表示更具体的需求.
示例 - 继承+组合+继承自公共类型的通用成员
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
}
Run Code Online (Sandbox Code Playgroud)
您可以通过无数种方式对其进行建模,但是通过接口,组合,继承和泛型,您可以提供有效的数据模型.