面向對象學習之二:繼承
創新互聯公司是一家集網站建設,馬村企業網站建設,馬村品牌網站建設,網站定制,馬村網站建設報價,網絡營銷,網絡優化,馬村網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
1、成員的可訪問性:
訪問修飾符 | 意義 |
public | 成員定義范圍的外部和內部都是完全可見的,即對公共成員的訪問不受限制。 |
protected | 成員僅對定義類及其派生類可見。 |
internal | 成員在包含它的程序集內部的任何地方可見,這包括定義在類以及程序集內定義類之外的任何范圍。 |
private | 成員只在定義類內可見,這是最嚴格的訪問形式,是類成員默認的訪問級別。 |
2、成員隱藏:
繼承可以擴展功能,但不能移除功能,例如,基類里可用的公共方法,在派生類及派生類的派生類的實例里都是可用的。不能從派生類中移除這些功能。請看下面代碼:
namespace 隱藏成員 { public class A { public void DoSomething() { Console.WriteLine("A.DoSomething"); } } public class B : A { public new void DoSomething() { Console.WriteLine("B.DoSomething"); } public void DoSomethingElse() { Console.WriteLine("B.DoSomethingElse"); } } class Program { static void Main(string[] args) { B b = new B(); b.DoSomething(); b.DoSomethingElse(); A a = b; a.DoSomething(); Console.ReadKey(); } } }
分析:
程序運行結果為:
雖然類B隱藏了類A的DoSomething實現,但并沒有移除它,只是在通過B引用來調用的時候隱藏了。在Main方法中可以看到,可以輕松的繞過這一點。通過隱式轉換把B實例引用轉換成A實例引用,就可以通過A實例引用來調用A.dosomething的實現。因此A.dosomething并沒有丟掉,而是隱藏了,需要多做一點工作來找到它。
3、override和new方法:
在派生類中重寫方法,必須用override修飾符來標記方法。否則,編譯器會提示警告,要求在派生方法中提供new修飾符或override。而且,編譯器默認使用new修飾符,看看下面的代碼:
namespace 繼承和虛方法 { public class A { public virtual void SomeMethod() { Console.WriteLine("A.SomeMethod"); } } public class B : A { public void SomeMethod() { Console.WriteLine("B.SomeMethod"); } } class Program { static void Main(string[] args) { B b = new B(); A a = b; a.SomeMethod(); Console.ReadLine(); } } }
分析:
運行結果是:調用A.SomeMethod。
New關鍵字打破了這個層次結構中的虛函數鏈。當一個虛方法通過對象引用調用的時候,調用的方法取決于運行時的方法表,如果方法是虛的,運行時會搜索層次結構尋找方法在繼承體系中最底層的派生版本,然后調用它(這里是類B)。但是,如果在搜索過程中遇到一個標有new修飾符的方法,它會退回繼承體系中的上一級類(這里是類A),并使用這個類中的方法。由于C#在new和override都不存在的情況下默認使用new修飾符,這就是為什么A.SomeMethod被調用的原因。
如果B.SomeMethod標記為override,這段代碼就會調用B.SomeMethod。
4、Base關鍵字:base允許訪問一個實例的基類實現,看看下面代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 繼承 { public class A { private int x; public A(int var) { this.x = var; } public virtual void DoSomething() { Console.WriteLine("A.DoSomething"); } } public class B : A { public B():base(123) { } public override void DoSomething() { Console.WriteLine("B.DoSomething"); base.DoSomething(); } } class Program { static void Main(string[] args) { B b = new B(); b.DoSomething(); Console.ReadKey(); } } }
分析:
本例中可以看到兩處使用base關鍵字,
第2個地方是B.DoSomething實現,在類B的實現中,實現B.DoSomething的時候借用類A中的A.DoSomething實現,因此,可以在B.DoSomething實現內通過base關鍵字直接調用A.DoSomething。
通常,調用實例的虛方法會調用虛方法最底層的實現,也就是B.DoSomething。但是,如果通過base關鍵字調用,就會調用基類最底層的的派生方法。因為A是基類,A.DoSomething是DoSomething相對于類A的基類方法,因此base.DoSomething就會調用A.DoSomething。這樣可以實現一個重寫方法,同時借用基類的實現。
本文名稱:面向對象學習之二:繼承
當前URL:http://vcdvsql.cn/article34/gjdhpe.html
成都網站建設公司_創新互聯,為您提供小程序開發、響應式網站、服務器托管、定制網站、外貿建站、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯