星期一, 6月 02, 2014

[C#] 物件導向 - 繼承

MVA 課程 Programming in C# Jump Start 中的範例,用自己的想法改寫並紀錄,下面範例兩大重點
  1. 物件導向繼承概念
  2. 利用 as 和 強制轉換(鑄型)的差異

namespace OOP_Inherit
{
    class Program
    {
        static void Main(string[] args)
        {
            var animal = new Animal();
            var snoopy = new Snoopy();

            // 傳入 snoopy 參數來說明繼承概念,會印出
            // OOP Inhert Sample
            // Snoopy 的主人是 Charlie Brown,他有 2 隻腳
            OOP_Inhert_Sample(snoopy);

            Console.WriteLine("==========================");

            // 傳入 animal 參數來說明轉型,會印出
            // OOP Inhert Sample
            // dog 是 null
            // 無法將類型 "Animal" 的物件轉換為類別 "Snoopy"
            OOP_Inhert_Sample(animal);
        }

        // 傳入參數為 Animal class,Dog 和 Spoony 因為繼層關係也是 Animal Class
        public static void OOP_Inhert_Sample(Animal a)
        {
            a.Name = "OOP Inhert Sample";
            Console.WriteLine(a.Name);

            // 判斷參數 a 是不是 Snoopy class
            if (a is Snoopy)
            {
                // 利用 as 把參數 a 轉型為 Snoopy class,
                // 轉型失敗會回傳 null,轉型成功,Snoopy Class 會有 Master Property
                var snoopy = a as Snoopy;
                if (snoopy != null)
                {
                    // Snoopy class 因為繼承 Dog Class 所以也有 Legs Property
                    snoopy.Legs = 2;
                    snoopy.Master = "Charlie Brown";

                    Console.WriteLine(string.Format("Snoopy 的主人是 {0},他有 {1} 隻腳", snoopy.Master, snoopy.Legs));
                }
            }

            // 下面是比較利用 as 和 鑄型來轉換 class 使用上的差異:
            // 1. 利用 "as" 把參數 a 轉型為 Dog class,轉型失敗會回傳 null
            // 2. 利用 "鑄型" 把參數 a 轉型為 Snoopy class,轉型失敗的話,會傳出 exception
            var dog = a as Dog;
            if(dog == null) Console.WriteLine("dog 是 null");

            try
            {
                var Error = (Snoopy)a;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }

        public class Animal { public string Name { get; set; } };
        public class Dog : Animal { public int Legs { get; set; } };
        public class Snoopy : Dog { public string Master { get; set; } };

    }
}


[C#] 物件導向 - 繼承

沒有留言:

張貼留言