協變與逆變:實際應用
在實際場景中實現協變和逆變可以增強程式碼的靈活性和可重複使用性。以下是一個簡化的範例:
協變 (ICovariant):
協變介面定義輸出參數,允許將衍生型別賦值給較少派生的型別。例如:
<code class="language-c#">public interface ICovariant<out T> { } public class Covariant<T> : ICovariant<T> { } public class Fruit { } public class Apple : Fruit { }</code>
此處,ICovariant<Fruit>
可以賦值給 ICovariant<Apple>
,因為 Apple 是 Fruit 的子類型。協變允許我們儲存不同類型的資料而無需強制轉換,使程式碼更簡潔和通用。
逆變 (IContravariant):
逆變介面定義輸入參數,允許將較少派生的類型賦值給更多派生的類型。例如:
<code class="language-c#">public interface IContravariant<in T> { } public class Contravariant<T> : IContravariant<T> { }</code>
IContravariant<Apple>
可以賦值給 IContravariant<Fruit>
,因為 Fruit 是 Apple 的超型。逆變允許接受不同類型的輸入參數,同時確保一致的行為。
範例:
以下程式碼示範了協變和逆變的用法:
<code class="language-c#">public class TheInsAndOuts { public void Covariance() { ICovariant<Fruit> fruit = new Covariant<Fruit>(); ICovariant<Apple> apple = new Covariant<Apple>(); Covariance(fruit); Covariance(apple); // 通过协变允许从 Apple 向 Fruit 上转型 } public void Contravariance() { IContravariant<Fruit> fruit = new Contravariant<Fruit>(); IContravariant<Apple> apple = new Contravariant<Apple>(); Contravariant(fruit); // 通过逆变允许从 Fruit 向 Apple 下转型 Contravariant(apple); } public void Covariant(ICovariant<Fruit> fruit) { } public void Contravariant(IContravariant<Apple> apple) { } }</code>
總結:
協變和逆變使開發人員能夠透過允許相容的類型賦值來創建靈活且可重複使用的程式碼。它們擴展了繼承的功能,促進了不同類型物件之間的資料處理和參數傳遞。
以上是協變和逆變如何增強程式碼靈活性和可重複使用性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!