多重继承?

jwr*_*ail 9 c# inheritance interface class multiple-inheritance

我已经在网上寻找可以帮助我解决令我困惑的设计问题的信息.我是复杂的继承情况的新手,所以我的解决方案实际上只能植根于更好的设计中.但是在试图找出我的设计应该是什么时,我一直认为我真的只需要继承超过1个基类.

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

资产开始......

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

每个PhysicalServer都需要同时是PhysicalDeviceServer
每个VirtualServer都需要同时是VirtualDeviceServer
每个NetDevice都是PhysicalDevice
每个StorageArray都是一个PhysicalDevice

我想的一个解决方案是复制PhysicalServersVirtualServers服务器代码,但是,我觉得这与我试图做的事情相违背,这是继承.

它们需要是单独的类,因为每个类型都有属性和方法.例如,服务器将有OSCaption,内存,特效等PhysicalDevice会之类的位置,串口,供应商等,并VirtualDevice将有ParentDevice,国家,VHDLocation等.

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

看似有趣的东西是Interfaces.似乎我可以将所有基类定义为接口,并根据需要在我的主类中实现它们.但是,我只是不确定如果我这样做会产生什么影响.

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

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

Tim*_*ora 8

接口是确保跨类型的合同完整性的适当方式,但最终可能会为每个实现提供重复的代码.

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

示例 - 继承+组合

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)

您可以通过无数种方式对其进行建模,但是通过接口,组合,继承和泛型,您可以提供有效的数据模型.

  • 组合优于继承的+1 - 我发现大多数情况下继承导致一些头部刮伤可以通过组合方法解决. (2认同)