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

本文关键字:共享 方法 定义 接口 是否 | 更新日期: 2023-09-27 18:34:22

假设我有 4 个类:FooBarQuxBaz。我还有一个界面IFubar.

这些类彼此继承,如下所示:

Bar : Foo, IFubar
Qux : Baz, IFubar

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

有没有一种简单的方法可以在界面中使用某种"默认"逻辑,因为缺乏更好的术语?现在我的"实现"只是对另一个类中的静态方法的调用,它允许我在那里执行我所有的逻辑并最大限度地减少代码重复。但是,我觉得这不是一个优雅的解决方案。

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

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

这都是针对 Unity3D 引擎中使用的内容,因此我主要限于 .NET 3.5 中的内容。

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

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

"几乎总是"是问题所在。如果是"总是",那么"扩展方法"将是理想的:

public static class FubarExtensions
{
    public static void SomeMethod(this IFubar obj) { ... }
}

如果你需要"几乎",他们可能需要多态性才能可靠。在这种情况下,对默认实现使用静态方法可能是您的最佳选择,即

IFubar.SomeMethod(...)
{
    Fubar.SomeMethodDefault(this, ...);
}

或:

public virtual void SomeMethod(...)
{
    Fubar.SomeMethodDefault(this, ...);
}

(或任何类似的组合(

如果实现总是相同的,那么您可以使用这样的东西:

class Fubar : IFubar {
    public void SomeIFubarMethod() { … }
}
class Foo : Fubar { … }
class Baz : Fubar { … }

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

class Bar : Foo { … }
class Qux : Baz { … }