无法将代码放入接口的解决方法
本文关键字:接口 解决 方法 代码 | 更新日期: 2023-09-27 18:09:30
假设我有一个接口是由很多很多不同的类实现的:
public interface IHaveObjects
{
object firstObject();
}
(注意:我不能使它成为一个抽象基类作为IHaveObjects的实现者可能已经有一个基类)
现在我想给接口添加一个新方法,这样接口的一个实现者就可以对它有特殊的行为。理想情况下,我会这样做:
public interface IHaveObjects
{
object firstObject();
object firstObjectOrFallback()
{
return firstObject();
}
}
然后去接口的一个实现者并给它重写:
public class ObjectHaverPlus : IHaveObjects
{
public override object IHaveObjects.firstObjectOrFallback()
{
return firstObject() ?? getDefault();
}
}
然而,在c#中禁止在接口中提供方法体,并且我想避免让每个IHaveObjects
的实现器都加入firstObjectOrFallback()
的定义。(想象一下,如果有数百或数千个)
有没有办法做到这一点,而不需要大量的复制粘贴?
如何引入从IHaveObjects继承的第二个接口。
那么您只需要更改这些类,它们需要使用新方法的新接口。
这看起来像:
interface I1
{
void Method1();
}
interface I2 : I1
{
void Method2();
}
这就是接口的问题——它们没有任何默认实现,所以对它们的任何更改都是破坏性的更改——也就是说,代码需要修改才能与新版本的接口一起工作。
因为你的实现已经有了自己的基类-你不能把它变成抽象类,也没有C#
有多个类继承。
你能做的是思考——它真的是一个接口上的方法吗?或者它可以作为接口上的extension method
实现(没有尝试,但我想它会工作得很好)?
如果它是一个接口上的方法,它应该留在那里-您可能会考虑将该接口分为两部分,第二部分继承第一部分(IHaveObjectsAndSupportDefault : IHaveObjects
),并在真正需要默认值的地方使用该接口(如其他一些答案所示)。
我可能误解了你的问题,但是为什么不使用第二个接口呢?
public interface IHaveObjectsEnhanced
{
object FirstObjectOrFallback();
}
然后你可以实现第一个和第二个接口:
public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced
{
public object FirstObject()
{
}
public object FirstObjectOrFallback()
{
return FirstObject() ?? GetDefault();
}
}