是否可以为C#接口定义“共享”方法?

时间:2014-12-15 12:42:12

标签: c# inheritance interface .net-3.5

假设我有4个班级:FooBarQuxBaz。我还有一个界面IFubar

这些类如此继承:

Bar : Foo, IFubar

Qux : Baz, IFubar

IFubar中的方法几乎总是以相同的方式实现,无论哪个类继承它们。理想的解决方案是在IFubar本身实现,但我无法将IFubar更改为类,因为BarQux 具有分别从FooBaz继承,C#不支持多重继承。

是否有一种简单的方法可以在界面中使用某种“默认”逻辑,因为缺少更好的术语?现在我的“实现”只是调用另一个类中的静态方法,这允许我在那里执行所有逻辑并最小化代码重复。不过,我觉得这不是一个优雅的解决方案。

理想情况下,我希望从某个类和IFubar派生一个类,并让它自动获得相同的IFubar实现,而无需复制和粘贴。我很确定C#不可能做到这一点,但我想确定。

老实说,这只是一个轻微的烦恼,我不得不一遍又一遍地复制和粘贴相同的代码,但我一直在想一个更优雅的解决方案,我不能。

这将全部用于Unity3D引擎中使用的内容,因此I'm limited to things in .NET 3.5, mostly.

有没有人有更好的解决方案或建议?

2 个答案:

答案 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 { … }

然后,您可以对BarQux使用相同的继承(并且您甚至不需要再次指定IFubar接口):

class Bar : Foo { … }

class Qux : Baz { … }