程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎鞏固(1)-多態+簡單工廠,

C#基礎鞏固(1)-多態+簡單工廠,

編輯:C#入門知識

C#基礎鞏固(1)-多態+簡單工廠,


多態 

如果要簡要的描述多態的話,我個人是這樣理解的:通過繼承,父類定義方法,具休的實現由子類進行。

01代碼

 //父類
    class Person
    {
        public  virtual void  skill()  //vitrual -虛方法,方法可被重寫
        {
            Console.WriteLine("人會走路");
        }
    }
    class Xiaoming:Person 
    {
        public override void skill() //重寫父類方法
        {
            Console.WriteLine("小明會唱歌");
        }
    }
    class XiaoHu : Person
    {
        public override void skill()
        {
            Console.WriteLine("小虎會游泳");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Xiaoming();//裡氏轉換原則 可以將子類賦值給父類
            Person p2 = new XiaoHu();
            p1.skill();
            p2.skill();

            Console.ReadKey();
        }
    }

輸出:

 通過這個例子 Person 類定義了skill方法,方法的具體實現由子類進行。

 

02如果不重寫的話

即 如果子類的 override 改為new  那麼父類和子類的方法是獨立的,此時執行下面的代碼

 //父類
    class Person
    {
        public  virtual void  skill()
        {
            Console.WriteLine("人會走路");
        }
    }
    class Xiaoming:Person 
    {
        public new  void skill() //重寫父類方法
        {
            Console.WriteLine("小明會唱歌");
        }
    }
   
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Xiaoming();//裡氏轉原則
            Xiaoming p2 = new Xiaoming();
            p1.skill();
            p2.skill();
            Console.ReadKey();
        }
    }

輸出:

可以看出,p.skill();這裡看.前面的對象,是什麼類型的,就執行那個類裡裡面的 skill()方法,這裡P1是Person類的,P2是Xiaoming類的。

多態+簡單工廠

如果我想通過輸入 小明,小虎。 這時候系統自動給顯示小明會什麼,小虎會什麼出來。

那麼首先增加一個工廠類

生活中工廠是用來加工的產品的,同樣這裡也是根據傳入的參數,加工後返回對應的結果

全部代碼

//父類
    class Person
    {
        public  virtual void  skill()
        {
            Console.WriteLine("人會走路");
        }
    }
    class Xiaoming:Person //繼承Person
    {
        public override  void skill() //重寫父類方法
        {
            Console.WriteLine("小明會唱歌");
        }
    }
    class XiaoHu : Person
    {
        public override void skill()
        {
            Console.WriteLine("小虎會游泳");
        }
    }
    //工廠類 --新增
    class Factory
    {
        public static Person instance(string Name)
        {

            switch (Name)
            {
                case "1": return new Xiaoming();
                case "2":return new XiaoHu();
                default: return null;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請輸入序號查看技能,輸入1、2....");
            Console.WriteLine("1.小明");
            Console.WriteLine("2.小虎");
            Console.WriteLine("輸入:");
            string res = Console.ReadLine();
            Console.WriteLine("結果:");
            Person p = Factory.instance(res);
            if (p != null)
            {
                p.skill();
            }
            else
            {
                Console.WriteLine("沒找到這個人");
            }
            Console.ReadKey();
        }
    }

 

執行結果:

此時,多態+簡單工廠就已經實現了。

拓展1:抽象(abstract)實現多態

   1. 前面的 virtual(虛方) 實現多態已經完成了,其實 抽象(abstract)實現多態也是大同小異

   2. abstract 和virtual的區別在於abstract 沒有方法體,方法都可以被重寫。

  實現:把上面完整的代碼 的父類改成 下面就完成了,功能一樣。

 //父類
   abstract  class Person
    {
        public abstract void skill();//方法沒有方法體
        
    }

拓展2:接口(interface)實現多態

 1.這裡就不是繼承了,是實現接口的方法。

 2.接口的方法和抽象一樣沒有方法體。

實現:把上面完整的代碼的父類改成接口

 //接口
   interface  Person
    {
         void  skill();
    }

然後把原來子類的 override 去掉 ,因為接口(interface)是不能被重寫(override)的。虛方法(virtual),抽象(abstract)才能被重寫

OK,接口實現多態也是完成了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved