国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

不要在對抽象類接口abstract virtual什么的混淆不清了

2019-11-17 02:04:23
字體:
來源:轉載
供稿:網友

不要在對抽象類接口abstract virtual什么的混淆不清了

2015-04-15 07:36 by JasonShenW, ... 閱讀, ... 評論, 收藏, 編輯

(最近帶一個新手入門 講這邊老費力了。)

接口和抽象類不過都是類的抽象罷了,這是他們的本質,只不過人們的思維角度不同而已,一個偏向為行為契約上的抽象(接口) 一個更像大自然中的繁衍關系(抽象類)。

直接上代碼:

class 抽象類    {        public static void Main(string[] args)        {            ChinesePerson c = new ChinesePerson("xx", 23);            c.Run();            c.Speak();            Console.WriteLine(c.Name);            Console.WriteLine(c.Age);            Console.WriteLine(c.Hobby);            Console.WriteLine("--------");            c.fight();            JiangSuPerson j = new JiangSuPerson();            j.Name = "xiaomao";            j.Age = 24;            j.Run();            j.Speak();            j.fight();            j.sing();            Console.WriteLine(j.Name);            Console.WriteLine(j.Age);            Console.WriteLine(j.Hobby);            Console.WriteLine("----------");            HenanPerson h = new HenanPerson();            h.Name = "linyi";            h.Speak();            h.fight();            h.sing();            Console.ReadKey();        }    }    public interface IRun    {        void Run();    }  public abstract class Person : IRun    {        PRivate string name;        private int age;        public string Name        {            get { return name; }            set { name = value; }        }        public int Age        {            get { return age; }            set { age = value; }        }        public abstract string Hobby { get; set; }        public Person(string name, int age)        {            this.Name = name;            this.Age = age;        }        public Person()        { }        public abstract void Speak();        public void Run()        {            Console.WriteLine("Running ~~");        }        //能夠被子類重寫的 只有 abstract 或virtual修飾的,        //不同在于,abstract一定要被重寫,而virtual則是可以被重寫 但不一定非要重寫,還有就是virtual要有方法體。        public virtual void fight()        {            Console.WriteLine("fighting");        }    }    public class ChinesePerson : Person    {        public ChinesePerson(string name, int age)            : base(name, age)        {            this.Name = name;            this.Age = age;        }        public ChinesePerson()        {        }        public override void Speak()        {            Console.WriteLine("中國人說中文");        }        public override string Hobby        {            get            {                return "shopping";            }            set            {            }        }        public override void fight()        {            base.fight();            Console.WriteLine("chinese gongfu fighting");        }        public virtual void sing()        {            Console.WriteLine("用中文唱歌");        }    } //繼承自中國人,但是沒有任何重寫    public class JiangSuPerson : ChinesePerson    {    }    public class HenanPerson : ChinesePerson    {        public override void Speak()        {            Console.WriteLine("河南人說河南方言");        }        public override void sing()        {            Console.WriteLine("用河南話唱歌");        }    }

總結一下:抽象類 和接口都是類的抽象,接口更關注從行為方面來抽象,而在語法上 接口的內容必須都是沒有實現的,完全等待后面的類來實現的而在這一點上,抽象類則像是一個沒有完全實現的類,他想所有普通類一樣,可以擁有字段,屬性,以及方法,這些都是可以有具體實現體的,但就這樣的話,他和普通類的差別只在于他不可以通過new實例化,而他的真正不同在于 他應該有abstract修飾的部分,這部分沒有具體實現,必須由由后面的實現類來具體實現。而virtual關鍵字本不該屬于這里的討論范疇,他修飾的方法和普通方法幾乎一樣,都是有著方法體的,但是被virtual修飾的可以被子類重寫。

再舉個例子模擬下mvc的控制器模塊

 //大致模擬了MVC框架中的控制器模塊的思想    class 抽象類二    {        public static void Main(string[] args)        {            IController ic;            ic = new HomeController();            ic.Execute();            Console.ReadKey();        }    }    public interface IController    {        void Execute();    }    public abstract class ControllerBase : IController    {        //可以選擇性的重寫這整個方法,而不按照所期望的分步驟        public virtual void Execute()        {            Console.WriteLine("doing some unimporting things");            ExecuteCore();        }        //這個方法則必須實現        public abstract void ExecuteCore();    }    public abstract class Controller : ControllerBase    {        public override void ExecuteCore()        {            Console.WriteLine("doing some importing things");        }                //public override void Execute()        //{        //    Console.WriteLine("doing the whole things");        //}    }    public class HomeController : Controller    {    }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武隆县| 舞阳县| 临夏县| 晴隆县| 鹤庆县| 和田市| 桦南县| 德钦县| 甘孜县| 洛隆县| 同心县| 临夏县| 莱州市| 阿巴嘎旗| 界首市| 永顺县| 五原县| 峨眉山市| 广丰县| 乃东县| 正宁县| 龙海市| 和林格尔县| 凤山县| 大宁县| 高邑县| 乐亭县| 库尔勒市| 呼玛县| 赤城县| 长阳| 隆子县| 仙居县| 宽城| 潮安县| 施甸县| 墨江| 岑巩县| 商洛市| 马尔康县| 岳阳县|