如何处理.Net中的真实世界多继承场景?

时间:2014-01-06 21:18:32

标签: .net inheritance data-modeling multiple-inheritance

我之前听说过多重继承的陷阱,我知道.Net开发者反对它的包容。

话虽如此,请考虑一个简单的例子,如“游戏公司”。游戏公司可以是:

如果我必须在.Net中对此进行建模,我将如何看待“是一种”关系存在并且公司可以同时成为其中的多个?想象一下,我已经建模了一个:

  1. Game课程,List<Developer>Publisher属性
  2. Console具有Manufacturer属性的类。
  3. 在理想情况下,这应该尽可能安全,并且易于过滤和导航到每个类(如完全连接的实体框架映射)。

    我想到了同样的事情,我可能知道“正确”的答案。

    如果我将FatPersonTallPerson作为基类并想要“解决”多重继承限制怎么办?因为很可能同时拥有既肥胖又高大的人。在这种情况下,如果只有一个Person有两个属性WeightHeight,那么它可能会更清晰,完全消除基类。这只是重写之前我所拥有的任何过滤的问题,这是基于考虑这些新属性的对象类型。

    对于每个多重继承案例,是否存在与此相当的内容?对于我提出的这个特殊情况怎么样?

    更新

    我已经读过那个标记为我的副本的答案(在发布之前),但我在这里略有不同意见。我认为这与将SQL优化问题标记为每个其他SQL优化问题的副本相同。最后,每个案例都是不同的案例,需要采用不同的方法/答案。我认为这适用于此,因为我问过一个非常固定的案例,就像其他答案一样。

1 个答案:

答案 0 :(得分:1)

此方案是基于角色的软件工程的一个很好的示例,它是研究中的当前主题。那是因为没有唯一的解决方案来解决这个问题。有几种方法,但都有它们的缺点。

接口是设计类型关系的好方法。如果你做DeveloperPublisher接口,可以有两家公司。但是,您无法从接口继承代码,并且通常最终会出现大量重复代码。

更进一步,你提出了mixin继承。这基本上是使用扩展方法扩充的接口实现。看一下这个例子:

class Company { }

interface Publisher { }
public static class PublisherMixin
{
    public static void Publish(this Publisher p) 
    {
        //do something
    }
}

class CompanyThatIsAPublisher : Company, Publisher { }

然后你可以做

var c = new CompanyThatIsAPublisher():
c.Publish();

您可以为多个mixin执行此操作。你甚至可以在弱参考词典的帮助下为mixin提供状态。

避免代码重复的另一种方法是委托。您仍然拥有接口层次结构,但为开发人员角色,发布者角色等创建对象。然后,公司只是将方法调用转发给这些子对象。然而,这导致了对象精神分裂症。子对象实际上不属于可能造成问题的主要对象。但是你可以轻松地交换它们。

在C#中你也可以使用DynamicObject。通过这种方式,您可以动态注册角色并动态地将方法调用重新路由到适当的对象。因此,开发公司最终可以成为出版商,而不必失去其身份。这种方法也受到对象精神分裂症问题的困扰。