【发布时间】:2013-08-04 15:17:03
【问题描述】:
我最近在一次采访中被问到是否知道有一种方法可以绕过/规避 .NET 限制,即类只能从单个类继承,而不能从多个类继承。显然我不知道答案,否则我不会在这里问这个问题。没有实现多个接口(这似乎是一个错误的答案)或将类链接到一个从另一个继承自另一个的地方,还有另一种我不知道的方法来完成这个吗?
【问题讨论】:
标签: .net oop inheritance
我最近在一次采访中被问到是否知道有一种方法可以绕过/规避 .NET 限制,即类只能从单个类继承,而不能从多个类继承。显然我不知道答案,否则我不会在这里问这个问题。没有实现多个接口(这似乎是一个错误的答案)或将类链接到一个从另一个继承自另一个的地方,还有另一种我不知道的方法来完成这个吗?
【问题讨论】:
标签: .net oop inheritance
没有实现多个接口(这似乎是一个错误的答案)或将类链接到一个继承自另一个继承另一个的类,还有另一种我不知道的方法来实现这一点吗?
不,我怀疑实现多个接口是正确的答案。
这是相当标准的。假设您有课程Foo 和Bar,并且您希望课程FooBar 从Foo 和Bar“继承”。然后创建接口IFoo 和IBar 并拥有Foo : IFoo 和Bar : IBar。然后你会定义FooBar : IFoo, IBar 和标准实现将是
class FooBar : IFoo, IBar {
private readonly IFoo foo = new Foo();
private readonly IBar bar = new Bar();
// or pass these in as dependencies
public void Moo() {
foo.Moo();
}
public void Mar() {
bar.Mar();
}
}
是的,它可以写很多东西,但并不难那么(VS或R#中有工具可以帮助加快速度一点点)。
【讨论】:
Foo 和 Bar 与 FooBar 分开构建时质量更高。
Moo 和 Mar 的实现只是将调用转发给适当的接收者,这正是多重继承中会发生的事情。如果需要,您甚至可以覆盖该行为。
FooBar.Moo 转发到Foo.Moo,只需实现新行为即可。那就是不要调用foo.Moo,而是做其他事情。