我有一個這樣的界面:
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());
}
}
由于我現在需要在從我的介面派生的所有類上使用(大型)通用方法,因此我試圖為此提供一個額外的基類:
public class MyBaseClass
{
public void LargeCommonMethod()
{
Console.WriteLine((this.a * 3).ToString()); // no 'a' on base class
}
}
這顯然不起作用,因為基類還需要實作我的介面才能了解該a欄位。
我現在問自己最好的方法是什么:
- 使
MyBaseClass繼承ITestInterface? - 集
LargeCommonMethod()到protected并提供它通過引數使用的所有內部資料?(實際上有很多這樣的..) - 一直跳過介面并用抽象基類替換它?
- ...?
uj5u.com熱心網友回復:
C# 8 正好為這種情況提供了一個特性。
- 你的類都實作了一個介面
- 你想給介面添加一個方法
- 您不希望對所有現有類進行重大更改。如果向介面添加方法,所有類都會中斷,除非您找到某種方法將方法添加到所有類。(這包括將它們全部修改為從新的基類繼承。)
該功能是默認介面方法。
您可以將您的方法和默認實作添加到介面:
public interface ITestInterface
{
int a { get; set; }
void DoSomething();
void LargeCommonMethod()
{
Console.WriteLine((this.a * 3).ToString());
}
}
您現有的實作該介面的類不會中斷。當轉換為介面時,您將能夠呼叫介面中定義的方法。您仍然可以修改任何類以提供自己的實作,覆寫介面的默認實作。
為了使方法可用,物件必須轉換為介面 - ITestInterface。
許多開發人員——包括我自己——發現這是一個奇怪的功能。但這是它的場景。
一些檔案
最常見的場景是將成員安全地添加到已被無數客戶端發布和使用的介面中。
uj5u.com熱心網友回復:
如果您需要方法的基本實作,那么介面顯然不是要走的路。
我會選擇一個抽象類并擺脫介面。基本上沒有必要使設計復雜化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406511.html
標籤:
