我们应该在什么时候使用C#中的默认接口方法? [英] When should we use default interface method in C#?

查看:0
本文介绍了我们应该在什么时候使用C#中的默认接口方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C#8及更高版本中,我们有default interface methods,因此:

这不是破坏了接口的原则吗?

什么时候应该使用默认接口方法而不是基础(抽象)类

推荐答案

为什么我们有接口?

从理论上讲,接口实现和类继承都解决了同一个问题:它们允许您在类型之间定义subtype relationship

那么为什么我们在C#中两者都有呢?我们到底为什么需要接口呢?难道我们不能像在C++中那样,将接口定义为抽象类吗?

原因是the diamond problem(Image source)

如果BC实现方式不同,则应继承哪个实现方式?这是一个棘手的问题,Java和C#设计者决定通过只允许不包含任何实现的特殊基类型的多重继承来避免这个问题。他们决定将这些特殊的基类型称为接口

因此,不存在接口的原则。接口只是解决特定问题的工具。

那么我们为什么需要默认实现?

向后兼容。您编写了一个非常成功的库,全世界成千上万的开发人员都在使用它。您的库包含一些接口I,现在您决定在它上需要一个额外的方法M。问题是:

  • 您不能将另一个方法M添加到I,因为这会破坏实现I的现有类(因为它们不实现M),并且
  • 您不能将I更改为抽象基类,因为这也会破坏实现I的现有类,并且您将失去执行多重继承的能力。

那么,默认实现如何避免菱形问题?

通过不继承这些默认方法(示例灵感来自this article中的示例,请参阅全文以了解一些有趣的角落用例):

interface I1
{
    void M() { Console.WriteLine("I1.M"); } // default method
}

interface I2
{
    void M() { Console.WriteLine("I2.M"); } // default method
}

class C : I1, I2 { }

class Program
{
    static void Main(string[] args)
    {
        // c, i1 and i2 reference the same object
        C c = new C();
        I1 i1 = c;
        I2 i2 = c;

        i1.M(); // prints "I1.M"
        i2.M(); // prints "I2.M"
        c.M();  // compile error: class 'C' does not contain a member 'M'
    }
}

这篇关于我们应该在什么时候使用C#中的默认接口方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆