繁体   English   中英

为什么 C# 允许在接口内部定义非抽象、非静态方法?

[英]Why does C# allows definitions of non-abstract, non-static methods inside of an interface?

我正在试验这个东西,我发现 C# 实际上允许你在接口内有非静态、非抽象的方法定义,这对我来说完全没有意义,因为它不符合 Object 面向范式的规则。 这是您可以在您的系统中测试的代码,它们实际上可以按照您期望的方式成功编译和运行。

接口测试:-

public interface Test
{
    public void Display() {
        Console.WriteLine("Display called from interface");
    }
}

Class 派生执行测试:-

public class Derived : Test
{
    public void SomeTestMethod()
    {
        Console.WriteLine("Just a method");
    }
}

程序.cs: -

class Program
{
    static void Main(string[] args)
    {
        Test instance = new Derived();
        instance.Display();
    }
}

此代码将完美运行,不会在控制台中产生 output“从界面调用显示”的任何问题。 对于为什么允许这样做,这对我来说完全没有意义。 当两个接口都由单个 class 实现时,这是否会重新引入菱形问题或在两个接口中定义的方法中存在歧义的问题。我不确定这是否已在较新版本的C# 还是 .Net Core 的东西。 如果有人知道原因请告诉我。 提前致谢。

这个问题的答案取决于。

  1. 此功能不存在,它是在 C# 8.0 中引入的。
  2. 当您必须更改现有应用程序或许多其他第三方使用的 package 中的界面时,这将有很大帮助。 它提供后向兼容性以及一些如何证明 SOLID 接口隔离的合理性,因为如果不需要,它不会强制实施这些方法。

例子。

  1. 考虑情景。 这是 Interface IService 的第一个版本。
public interface IService
{
    string GetMessage(); 
}
  1. 发布 package 或提供给其他应用程序。
  2. 该应用程序实现接口。
public class ServiceA : IService
{
    public string GetMessage()
    {
        return "From ServiceA";
    }
}

public class ServiceB : IService
{
    public string GetMessage()
    {
        return "From ServiceB";
    }
}

现在需要更改界面(最好避免这种情况),但如果您必须这样做。

C# 8.0 之前

public interface IService
{
    string GetMessage();
    string NewMessage(); 
}

现在,一旦该接口被其他已经实现该接口的人发布和使用。 它坏了。 (这是重大变化。)

从 C# 8.0 开始,您可以提供默认实现。

public interface IService
{
    string GetMessage();
    string NewMessage()
    {
        return "From Interface";
    }
}

ServiceA 决定执行,但 ServiceB 不执行,但它不会中断先前运行的应用程序。

public class ServiceA : IService
{
    public string GetMessage()
    {
        return "From ServiceA";
    }

    public string NewMessage()
    {
        return "From ServiceA NewMessage";
    }
}

public class ServiceB : IService
{
    public string GetMessage()
    {
        return "From ServiceB";
    }
}

从8.0版本开始,C#支持默认接口方法,具有traits的一些属性,也类似于Java的“默认方法”

此功能使 C# 能够与针对 Android (Java) 和 iOS (Swift) 的 API 进行互操作,后者支持类似的功能。

现在的问题是如果我们可以在接口中编写实现,那么抽象 class 和接口之间有什么区别。

C# 8 中的这个新特性在你已经编写了使用接口的代码并且有多个类继承自这个接口并且你想向接口添加额外的功能而不破坏正在使用我的接口的现有类时使用,你可以做的是使用默认接口方法并添加该功能,这允许您更新代码而不会打扰使用您接口的人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM