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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

c#中override重寫和new隱藏

2019-11-17 03:24:13
字體:
供稿:網(wǎng)友

c#中override重寫和new隱藏

最近學(xué)習(xí)c#,昨晚看書看到多態(tài)。由于個人本身是從事java開發(fā),于是拿來做對比便是自然的。

進入主題吧。

c#中,子類要重寫基類的方法,必須要基類聲明中帶有virtual關(guān)鍵字方法或者帶有abstract關(guān)鍵字的抽象方法,然后子類中重寫該方法時使用override關(guān)鍵字。

例如:

 class A    {        PRivate String name;        public String Name        {            get            {                return name;            }            set            {                name = value;            }        }        public A(String name)        {            this.name = name;        }        public virtual String Test()        {            return name;        }    }    class B : A    {        private int age;        public B(String name,int age)            : base(name)        {            this.age = age;        }        public override string Test()        {            return this.Name + ":" + age;        }    }

對于帶有關(guān)鍵字abstract的抽象方法,子類中必須要重寫,這與java中都是一樣的。但是在java中,子類重寫基類的普通方法,只需要與父類的方法聲明一致,就會重寫父類的方法。

重寫之后,在多態(tài)上的表現(xiàn)便會和大家期望的一致,調(diào)用子類重寫的方法,而不再是調(diào)用父類的方法了。

 static void Main()        {            A c1 = new A("Tom");            System.Console.WriteLine( c1.Test());            A c2 = new B("Jerry",20);            System.Console.WriteLine(c2.Test());         }

會發(fā)現(xiàn)后臺輸出的是

到這里,除了寫法上比java多了兩個關(guān)鍵字,其他都是一樣的,很好理解。但是在使用new隱藏父類方法的時候,就稍微有點暈了。

 class C : A    {        public String Code { set; get; }        public C(String name)            : base(name)        {            this.Code = "100001";        }        public new String Test()        {            return this.Name + ":" + this.Code;        }           }

如上,使用new關(guān)鍵字隱藏父類的Test方法,這里,隱藏父類方法,不像重寫那么嚴(yán)格,關(guān)鍵字可以與父類不同,甚至連返回類型也可以不同,但是方法名和參數(shù)必須一致。

運行代碼

 static void Main()        {            System.Console.WriteLine("這是main方法");            A c1 = new A("Tom");            System.Console.WriteLine( c1.Test());            B c2 = new B("Jerry",20);            System.Console.WriteLine(c2.Test());            C c3 = new C("Anlex");            System.Console.WriteLine(c3.Test());        }

會發(fā)現(xiàn)結(jié)果,與之前重寫父類方法得到的效果一致,于是不太明白new到底做了什么用。

但是細(xì)心的朋友們一定注意到了,這里給大家埋了一個坑,運行的代碼里,都是定義了自己的對象,運行自己的方法,結(jié)果自然會是如此了,根本就沒有體現(xiàn)出多態(tài)。

如果這里是定義父類的變量,去指向子類的實體的話。

static void Main()        {            System.Console.WriteLine("這是main方法");            A c1 = new A("Tom");            System.Console.WriteLine( c1.Test());            A c2 = new B("Jerry",20);            System.Console.WriteLine(c2.Test());            A c3 = new C("Anlex");            System.Console.WriteLine(c3.Test());            System.Console.ReadLine();                    }

結(jié)果便是:

這時,c2.Test()是調(diào)用了子類重寫的方法,而c3.Test()是調(diào)用了父類的方法,并不會調(diào)用類C里的Test()方法。

到這里,我想大家都理解隱藏的意思了吧。也明白書上一直強調(diào)的,要慎用new關(guān)鍵字隱藏父類方法了吧。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 象州县| 闸北区| 循化| 蓬溪县| 陕西省| 新田县| 博白县| 怀柔区| 合江县| 子长县| 张北县| 泰安市| 浦北县| 康马县| 礼泉县| 九寨沟县| 东宁县| 昌图县| 铁岭市| 通州市| 平陆县| 阿勒泰市| 昭平县| 彩票| 衡山县| 满洲里市| 嘉义县| 都匀市| 通化县| 阜城县| 阳江市| 阜城县| 尉犁县| 巨鹿县| 河北区| 马龙县| 铜陵市| 敦煌市| 磐安县| 铁岭县| 颍上县|