最近學習c#,昨晚看書看到多態。由于個人本身是從事java開發,于是拿來做對比便是自然的。
進入主題吧。
c#中,子類要重寫基類的方法,必須要基類聲明中帶有virtual關鍵字方法或者帶有abstract關鍵字的抽象方法,然后子類中重寫該方法時使用override關鍵字。
例如:
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; } }
對于帶有關鍵字abstract的抽象方法,子類中必須要重寫,這與java中都是一樣的。但是在java中,子類重寫基類的普通方法,只需要與父類的方法聲明一致,就會重寫父類的方法。
重寫之后,在多態上的表現便會和大家期望的一致,調用子類重寫的方法,而不再是調用父類的方法了。
static void Main() { A c1 = new A("Tom"); System.Console.WriteLine( c1.Test()); A c2 = new B("Jerry",20); System.Console.WriteLine(c2.Test()); }
會發現后臺輸出的是
到這里,除了寫法上比java多了兩個關鍵字,其他都是一樣的,很好理解。但是在使用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關鍵字隱藏父類的Test方法,這里,隱藏父類方法,不像重寫那么嚴格,關鍵字可以與父類不同,甚至連返回類型也可以不同,但是方法名和參數必須一致。
運行代碼
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()); }
會發現結果,與之前重寫父類方法得到的效果一致,于是不太明白new到底做了什么用。
但是細心的朋友們一定注意到了,這里給大家埋了一個坑,運行的代碼里,都是定義了自己的對象,運行自己的方法,結果自然會是如此了,根本就沒有體現出多態。
如果這里是定義父類的變量,去指向子類的實體的話。
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(); }
結果便是:
這時,c2.Test()是調用了子類重寫的方法,而c3.Test()是調用了父類的方法,并不會調用類C里的Test()方法。
到這里,我想大家都理解隱藏的意思了吧。也明白書上一直強調的,要慎用new關鍵字隱藏父類方法了吧。
新聞熱點
疑難解答