是否可以为 C# 接口定义“共享”方法
本文关键字:共享 方法 定义 接口 是否 | 更新日期: 2023-09-27 18:34:22
假设我有 4 个类:Foo
、Bar
、Qux
和 Baz
。我还有一个界面IFubar
.
这些类彼此继承,如下所示:
Bar : Foo, IFubar
Qux : Baz, IFubar
IFubar
中的方法几乎总是以相同的方式实现,无论哪个类继承它们。理想的解决方案是将实现放在IFubar
本身中,但我无法将IFubar
更改为类,因为Bar
和Qux
必须分别从Foo
和Baz
继承,并且 C# 不支持多重继承。
有没有一种简单的方法可以在界面中使用某种"默认"逻辑,因为缺乏更好的术语?现在我的"实现"只是对另一个类中的静态方法的调用,它允许我在那里执行我所有的逻辑并最大限度地减少代码重复。但是,我觉得这不是一个优雅的解决方案。
理想情况下,我希望有一个类从某个类和IFubar
派生,并让它自动获得相同的IFubar
实现,而无需我复制和粘贴。我相当确定这种事情在 C# 中是不可能的,但我想确定一下。
老实说,我不得不一遍又一遍地复制和粘贴相同的代码,这只不过是一种轻微的烦恼,但我一直在努力想出一个更优雅的解决方案,但我做不到。
这都是针对 Unity3D 引擎中使用的内容,因此我主要限于 .NET 3.5 中的内容。
有人有更好的解决方案或建议吗?
"几乎总是"是问题所在。如果是"总是",那么"扩展方法"将是理想的:
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 { … }
然后你可以对Bar
和Qux
使用相同的继承(你甚至不需要再次指定IFubar
接口(:
class Bar : Foo { … }
class Qux : Baz { … }