5

假设我有一个许多不同类实现的接口:

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(). (想象一下,如果有数百或数千个)

有没有办法在没有大量复制粘贴的情况下做到这一点?

4

3 回答 3

2

如何引入从 IHaveObjects 继承的第二个接口。

比你只需要改变这些需要新接口和新方法的类。

这看起来像:

  interface I1
    {
        void Method1();
    }

    interface I2 : I1
    {
        void Method2();
    }
于 2013-04-17T05:43:56.457 回答
2

这就是接口的问题——它们没有任何默认实现,因此对它们的任何更改都是破坏性更改——即需要修改代码以使用新版本的接口。

由于您的实现已经有自己的基类 - 您不能将其转换为抽象类,也没有C#多类继承。

你能做的就是思考——它真的是一种接口方法吗?还是可以将其实现为extension methodon 接口(没有尝试过,但我想它会正常工作)?

如果它是接口上的方法并且它应该保留在那里 - 您可能会考虑将此接口分为两部分,第二部分继承自第一个 ( IHaveObjectsAndSupportDefault : IHaveObjects) 并在真正需要默认值的情况下使用此接口(如其他一些答案所示)。

于 2013-04-17T05:47:06.663 回答
1

我可能误解了您的问题,但为什么不使用第二个界面,例如:

public interface IHaveObjectsEnhanced
{

    object FirstObjectOrFallback();
}

然后你可以实现第一个和第二个接口:

public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced
{

    public object FirstObject()
    {

    }

    public object FirstObjectOrFallback()
    {
         return FirstObject() ?? GetDefault();
    }

}
于 2013-04-17T05:44:58.540 回答