是否可以定义一个;“共享”;C#接口的方法?

是否可以定义一个;“共享”;C#接口的方法?,c#,inheritance,interface,.net-3.5,C#,Inheritance,Interface,.net 3.5,假设我有4个类:Foo,Bar,Qux,和Baz。我还有一个接口IFubar 这些类彼此继承,如下所示: Bar : Foo, IFubar Qux : Baz, IFubar 无论哪个类继承它们,IFubar中的方法几乎总是以相同的方式实现的。理想的解决方案是在IFubar本身中实现,但我不能将IFubar更改为类,因为Bar和Qux必须分别从Foo和Baz继承,而C不支持多重继承 在没有更好的术语的情况下,有没有一种简单的方法可以在接口中使用某种“默认”逻辑?现在,我的“实现”只是对另一

假设我有4个类:
Foo
Bar
Qux
,和
Baz
。我还有一个接口
IFubar

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

Bar : Foo, IFubar

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

在没有更好的术语的情况下,有没有一种简单的方法可以在接口中使用某种“默认”逻辑?现在,我的“实现”只是对另一个类中的静态方法的调用,它允许我在那里执行所有逻辑并最小化代码重复。然而,我觉得这不是一个优雅的解决方案

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

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

这一切都是为了Unity3D引擎中使用的东西,所以

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

问题在于“几乎总是”。如果是“始终”,那么“扩展方法”将是理想的:

public static class FubarExtensions
{
    public static void SomeMethod(this IFubar obj) { ... }
}
如果您需要“几乎”,那么您可能需要多态性才能使其可靠。在这种情况下,对默认实现使用静态方法可能是最好的选择,即

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


(或任何类似的组合)

如果实现总是相同的,那么您可以使用如下内容:

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

class Foo : Fubar { … }

class Baz : Fubar { … }
然后,您可以对
Bar
Qux
使用相同的继承(甚至不需要再次指定
IFubar
接口):


你不能将
IFubar
更改为一个类,并让
*Foo*
*Baz*
从该类继承(而不是
Bar
Qux
),以避免多重继承问题吗?@petelids,正如我在下面的答案中所提到的那样,部分问题在于,当
obj
Foo
Baz
的实例时,我依赖
obj作为IFubar
返回null,而当
obj
Bar
Qux
的实例时,我成功地将其转换为
IFubar
实例。此外,在实际的实现中,有近十几个类实现了
IFubar
,所有这些类都继承自其他各种类,但是这种方法的问题是
Foo
Baz
可以成功地转换为
IFubar
——这对我的情况并不理想。这一实现的一部分依赖于
obj as IFubar
在对象未继承
IFubar
.Hmm时返回null。扩展方法似乎与我想要实现的非常接近——很少有我的默认实现不理想的情况,而且这些情况可以很容易地自行处理,所以我将此标记为我的答案。说“永远不会调用与接口或类方法具有相同名称和签名的扩展方法”。这意味着我需要在
IFubar
接口中去掉该方法的抽象版本,以确保调用扩展方法,对吗?
class Fubar : IFubar {
    public void SomeIFubarMethod() { … }
}

class Foo : Fubar { … }

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

class Qux : Baz { … }