假设我有4个班级:Foo
,Bar
,Qux
和Baz
。我还有一个界面IFubar
。
这些类如此继承:
Bar : Foo, IFubar
Qux : Baz, IFubar
IFubar
中的方法几乎总是以相同的方式实现,无论哪个类继承它们。理想的解决方案是在IFubar
本身实现,但我无法将IFubar
更改为类,因为Bar
和Qux
具有分别从Foo
和Baz
继承,C#不支持多重继承。
是否有一种简单的方法可以在界面中使用某种“默认”逻辑,因为缺少更好的术语?现在我的“实现”只是调用另一个类中的静态方法,这允许我在那里执行所有逻辑并最小化代码重复。不过,我觉得这不是一个优雅的解决方案。
理想情况下,我希望从某个类和IFubar
派生一个类,并让它自动获得相同的IFubar
实现,而无需复制和粘贴。我很确定C#不可能做到这一点,但我想确定。
老实说,这只是一个轻微的烦恼,我不得不一遍又一遍地复制和粘贴相同的代码,但我一直在想一个更优雅的解决方案,我不能。
这将全部用于Unity3D引擎中使用的内容,因此I'm limited to things in .NET 3.5, mostly.
有没有人有更好的解决方案或建议?
答案 0 :(得分:5)
"几乎总是"是问题。如果它是"总是",那么"扩展方法"会是理想的:
public static class FubarExtensions
{
public static void SomeMethod(this IFubar obj) { ... }
}
如果您需要"几乎",他们可能需要多态性才能可靠。在这种情况下,使用静态方法进行默认实现可能是您的最佳选择,即
IFubar.SomeMethod(...)
{
Fubar.SomeMethodDefault(this, ...);
}
或:
public virtual void SomeMethod(...)
{
Fubar.SomeMethodDefault(this, ...);
}
(或任何类似的组合)
答案 1 :(得分:0)
如果实现始终相同,那么您可以使用以下内容:
class Fubar : IFubar {
public void SomeIFubarMethod() { … }
}
class Foo : Fubar { … }
class Baz : Fubar { … }
然后,您可以对Bar
和Qux
使用相同的继承(并且您甚至不需要再次指定IFubar
接口):
class Bar : Foo { … }
class Qux : Baz { … }