我们说我有一个许多不同类实现的接口:
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()
的定义。 (想象一下,如果有数百或数千)
有没有办法在没有大量复制粘贴的情况下执行此操作?
答案 0 :(得分:2)
如何引入继承自IHaveObjects的第二个接口。
您只需要更改这些类,这需要使用新方法的新接口。
这看起来像:
interface I1
{
void Method1();
}
interface I2 : I1
{
void Method2();
}
答案 1 :(得分:2)
这是接口的问题 - 它们没有任何默认实现,因此对它们的任何更改都会破坏更改 - 即需要修改代码以使用新版本的接口。
由于您的实现已经有了自己的基类 - 您无法将其转换为抽象类,C#
也不具有多个类继承。
你能做的就是思考 - 它真的是界面上的一种方法吗?或者它可以在接口上实现为extension method
(没试过,但我想它会正常工作)?
如果它是接口上的方法并且它应该保留在那里 - 您可以考虑将此接口分为两部分,第二部分继承自第一部分(IHaveObjectsAndSupportDefault : IHaveObjects
)并使用此接口,其中确实需要默认值(像其他答案所示)。
答案 2 :(得分:1)
我可能误解了你的问题,但为什么不使用第二个界面,例如:
public interface IHaveObjectsEnhanced
{
object FirstObjectOrFallback();
}
然后你可以实现第一个和第二个接口:
public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced
{
public object FirstObject()
{
}
public object FirstObjectOrFallback()
{
return FirstObject() ?? GetDefault();
}
}