无法将代码放入接口的解决方法

时间:2013-04-17 05:32:17

标签: c# interface

我们说我有一个许多不同类实现的接口:

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()的定义。 (想象一下,如果有数百或数千)

有没有办法在没有大量复制粘贴的情况下执行此操作?

3 个答案:

答案 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();
    }

}