是否可以定义一个;“共享”;C#接口的方法?
假设我有4个类:是否可以定义一个;“共享”;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不支持多重继承 在没有更好的术语的情况下,有没有一种简单的方法可以在接口中使用某种“默认”逻辑?现在,我的“实现”只是对另一
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 { … }