2009年9月20日 星期日

Overriding Equals

Overriding Equals

 

當我們定義好一個類別之後,如果用這個類別來創建2個實體(Instance),
這兩個實體在記憶體分別儲存存在不同的位址,由此看來,這兩個實體的確
是不同的。 

以下面 Person 類別來說明: 


    class Person

    {

        public string Name = string.Empty;

        public string ID = string.Empty;

        public Person(string _name,string _id)

        {

            Name = _name;

            ID = _id;

        }

    }


 


Person 有兩個公開屬性,分別是 Name 與 ID。
如果程式如下:
Person p1=New Person("paladin","01");
Person p2=New Person("paladin","01"); 


這 p1 與 p2 ,雖然所傳入的值,都是 Name="paladin" ,ID="01",
但他們彼此卻是不相同的,可以透過以下的 Equals( )來知道。 


p1.Equals(p2)  


他會回傳 False。 


然而,今天如果我們想要重新定義,只要是 Name 與 ID 相同,就要視
兩個實體為相同,可以嗎? 


可以的,此時,可以透過覆寫 Equals( ) 來達成。


 


在 Person 類別裡,針對這個類別的 Equals( ) 方法進行覆寫,只要
Name 與 ID 相同,就視為相同的物件。 


將 覆寫的程式描述如下:


 


 


        public override bool Equals(object obj)
        {
            Person p = (Person)obj;


            return p.Name == this.Name && p.ID == this.ID;
        }


 


如此,執行 p1.Equals(p2) 時,
則會去比較 p2.Name 是否等於 p1.Name 且 p2.ID 是否等於 p1.ID ,
然後以此來回傳 Equals( ) 的值。


 


完整的 Person 的定義如下:


 


    class Person
    {
        public string Name = string.Empty;
        public string ID = string.Empty;


        public Person(string _name,string _id)
        {
            Name = _name;
            ID = _id;
        }


        public override bool Equals(object obj)
        {
            Person p = (Person)obj;


            return p.Name == this.Name && p.ID == this.ID;
        }



    }


 


 


而在實際比較時,就可以發現,此時 p1.Equals(p2) 就會回傳 True 了


 


        static void Main(string[] args)
        {
            Person p1 = new Person("paladin", "01");
            Person p2 = new Person("paladin", "01");


            Console.WriteLine(string.Format("p1 is the same with p2 ? {0}", p1.Equals(p2) ? "True" : "False"));
            Console.ReadKey();
        }


 


 



沒有留言:

張貼留言