簡體   English   中英

向從 C# 接口繼承的類添加通用方法?

[英]Add common method to classes inheriting from a C# Interface?

我有一個這樣的界面:

    public interface ITestInterface
    {
        int a { get; set; }

        void DoSomething();
    }

我的一些類是從這個接口派生的:

    public class OneClass : ITestInterface
    {
        public int a { get; set; }

        public void DoSomething()
        {
            Console.WriteLine(this.a.ToString());
        }
    }

    public class AnotherClass : ITestInterface
    {
        public int a { get; set; }

        public void DoSomething()
        {
            Console.WriteLine((this.a * 2).ToString());
        }
    }

由於我現在需要在從我的接口派生的所有類上使用(大型)通用方法,因此我試圖為此提供一個額外的基礎 class:

 public class MyBaseClass
    {
        public void LargeCommonMethod()
        {
            Console.WriteLine((this.a * 3).ToString()); // no 'a' on base class
        }
    }

這顯然不起作用,因為基礎 class 還需要實現我的接口才能了解a字段。

我現在問自己最好的方法是什么:

  • MyBaseClassITestInterface繼承?
  • LargeCommonMethod()設置為protected並通過 arguments 提供它使用的所有內部數據? (實際上有很多這樣的..)
  • 一直跳過接口並用抽象基礎 class 替換它?
  • ...?

C# 8 正好為這種情況提供了一個功能。

  • 你的類都實現了一個接口
  • 你想給接口添加一個方法
  • 您不希望對所有現有類進行重大更改。 如果向接口添加方法,所有類都會中斷,除非您找到某種方法將方法添加到所有類。 (這包括修改它們以從新的基礎 class 繼承。)

該功能是默認接口方法

您可以將您的方法和默認實現添加到接口:

public interface ITestInterface
{
    int a { get; set; }

    void DoSomething();

    void LargeCommonMethod()
    {
        Console.WriteLine((this.a * 3).ToString());
    }
}

您現有的實現該接口的類不會中斷。 當轉換為接口時,您將能夠調用接口中定義的方法。 您仍然可以修改任何 class 以提供自己的實現,覆蓋接口的默認實現。

要使該方法可用,必須將 object 轉換為接口 - ITestInterface

許多開發人員——包括我自己——發現這是一個奇怪的功能。 但這是它的場景。

一些文檔

最常見的場景是將成員安全地添加到已被無數客戶端發布和使用的接口中。

如果您需要方法的基本實現,那么接口顯然不是 go 的方式。

我會選擇一個抽象的 class 代替並擺脫接口。 基本上沒有必要使設計復雜化。

當您希望保持 ITestInterface 一致時,適配器模式可能適合您的用例:

public interface ITestInterface
{
    int a { get; set; }

    void DoSomething();
}

public class TestInterfaceAdapter : ITestInterface
{
    private readonly ITestInterface _testInterface;

    public int a {
        get => _testInterface.a;
        set => _testInterface.a = value;
    }

    public TestInterfaceAdapter(ITestInterface testInterface)
    {
        _testInterface = testInterface;
    }

    public void DoSomething()
    {
        _testInterface.DoSomething();
    }

    public void LargeCommonMethod()
    {
        Console.WriteLine((this.a * 3).ToString());
    }
}

public class OneClass : ITestInterface
{
    public int a { get; set; }

    public void DoSomething()
    {
        Console.WriteLine(this.a.ToString());
    }
}

public class AnotherClass : ITestInterface
{
    public int a { get; set; }

    public void DoSomething()
    {
        Console.WriteLine((this.a * 2).ToString());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM