簡體   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