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

本文关键字:接口 解决 方法 代码 | 更新日期: 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();
    }
}