我之前听说过多重继承的陷阱,我知道.Net开发者反对它的包容。
话虽如此,请考虑一个简单的例子,如“游戏公司”。游戏公司可以是:
如果我必须在.Net中对此进行建模,我将如何看待“是一种”关系存在并且公司可以同时成为其中的多个?想象一下,我已经建模了一个:
Game
课程,List<Developer>
和Publisher
属性Console
具有Manufacturer
属性的类。在理想情况下,这应该尽可能安全,并且易于过滤和导航到每个类(如完全连接的实体框架映射)。
我想到了同样的事情,我可能知道“正确”的答案。
如果我将FatPerson
和TallPerson
作为基类并想要“解决”多重继承限制怎么办?因为很可能同时拥有既肥胖又高大的人。在这种情况下,如果只有一个Person
有两个属性Weight
和Height
,那么它可能会更清晰,完全消除基类。这只是重写之前我所拥有的任何过滤的问题,这是基于考虑这些新属性的对象类型。
对于每个多重继承案例,是否存在与此相当的内容?对于我提出的这个特殊情况怎么样?
更新
我已经读过那个标记为我的副本的答案(在发布之前),但我在这里略有不同意见。我认为这与将SQL优化问题标记为每个其他SQL优化问题的副本相同。最后,每个案例都是不同的案例,需要采用不同的方法/答案。我认为这适用于此,因为我问过一个非常固定的案例,就像其他答案一样。
答案 0 :(得分:1)
此方案是基于角色的软件工程的一个很好的示例,它是研究中的当前主题。那是因为没有唯一的解决方案来解决这个问题。有几种方法,但都有它们的缺点。
接口是设计类型关系的好方法。如果你做Developer
和Publisher
接口,可以有两家公司。但是,您无法从接口继承代码,并且通常最终会出现大量重复代码。
更进一步,你提出了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。通过这种方式,您可以动态注册角色并动态地将方法调用重新路由到适当的对象。因此,开发公司最终可以成为出版商,而不必失去其身份。这种方法也受到对象精神分裂症问题的困扰。