簡體   English   中英

C#類型轉換基礎類/接口與通用方法

[英]C# Type casting base class / interface vs. generic method

說我有一個帶有共享接口的簡單繼承結構:

public interface IMammal
{
  ...
}

public class Human : IMammal
{
  ...
}

public class Animal : IMammal
{
  ...
}

並在另一個類(Main.cs或其他類)中說,我想實現一個方法。 以下哪項是“最佳實踐”:

public void MyFunction(IMammal input)
{
   // Do cool things with the IMammal.
}

要么

public void MyFunction<T>(T input) where T : IMammal
{
   // Do the same cool things with the IMammal.
}

注意:在這種簡單情況下,可能的解決方案是使IMammal成為抽象類,並在該抽象類中實現MyFunction。 我需要保持IMammal一個接口。

最佳實踐通常是第一種情況,並讓基礎運行時的多態行為為您處理類型。 除非您特別需要知道類型(並且作為泛型!),否則最好不要傳遞它。

當您要調用其他需要通用的方法(例如那些操縱集合或序列化並且必須處理T而不是對象的實際類型)的方法時,就會出現第二種選擇。 但是,這是非常罕見且非常具體的行為,因此最好僅在絕對必要的情況下使用它。

這取決於MyFunction 功能 如果MyFunction在沒有泛型的情況下按設計方式工作,則應采用這種方式-使用多態通常比引入泛型更干凈。 如果到達使用泛型有益的地步(例如,像添加到List<T>而不是List<Mammal>切換到泛型。

創建工作代碼,然后專注於我們改進

我認為最好是第一個,而不是如果您要調用其他類,則應該通過接口而不是類。

public void MyFunction(Mammal input)
{
   // Do cool things with the mammal.
}

另外,最好校准IMammal而不是Mammal接口。

這是因為MyFunction是另一個類的方法,根據最佳實踐,最好注入一個Interface而不是一個對象。

對於您的特殊情況,我通常會選擇第一種選擇。

但是,對於更復雜的情況,第二個選項更好,因為它允許您進一步指定類型約束,例如從多個接口,類和接口等繼承。例如,它還可以實例化新的T對象,如果您還在方法的where子句中包含new()

我看到兩個實現是等效的。 那么簡單就是最好的選擇,所以我更喜歡選擇#1。

如果MyFunction是哺乳動物的行為,則應在界面中。 如果您進行了一些驗證,例如,並且需要更高層次的ex進行其他驗證,則將其放在其他類中應該很好。

暫無
暫無

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

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