在設計父對象的時候,會遇到對象方法的參數為類別本身,然後再由子對象去實做這個方法的場合,例如:比較對象是否相等的方法。在這個情景中,通常會設計為下列范例的寫法,在子對象中先做轉型、再做比較。
這是一種可以正常運作的設計,但是子對象的方法參數會是父對象型別,而不是子對象型別。
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ChildAddress addressA = new ChildAddress(); addressA.Value001 = "123"; ChildAddress addressB = new ChildAddress(); addressB.Value001 = "123"; Console.WriteLine(addressA.EqualAddress(addressB)); Console.ReadLine(); } } } namespace ConsoleApplication1 { public abstract class Address { // Methods public abstract bool EqualAddress(Address address); } public class ChildAddress : Address { // Properties public string Value001 { get; set; } // Methods public override bool EqualAddress(Address address) { // Require ChildAddress childAddress = address as ChildAddress; if (childAddress == null) return false; // Equal if (childAddress.Value001 == this.Value001) { return true; } else { return false; } } } }
在一些情景中,如果希望子對象方法的參數,是參考子對象型別來做為輸入型別,依照下列的泛型寫法就可以完成這個目標。
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { ChildAddress addressA = new ChildAddress(); addressA.Value001 = "123"; ChildAddress addressB = new ChildAddress(); addressB.Value001 = "123"; Console.WriteLine(addressA.EqualAddress(addressB)); Console.ReadLine(); } } } namespace ConsoleApplication2 { public abstract class Address<TAddress> where TAddress : Address<TAddress> { // Methods public abstract bool EqualAddress(TAddress address); } public class ChildAddress : Address<ChildAddress> { // Properties public string Value001 { get; set; } // Methods public override bool EqualAddress(ChildAddress address) { // Equal if (address.Value001 == this.Value001) { return true; } else { return false; } } } }
上列這兩種范例,主要是應用的情景有些許不同。
第一個范例較常用在:子對象做為注入框架的對象。
第二個范例較常用在:子對象提供給外部系統使用時。