標籤:
物件導向的語言三大特點:封裝、繼承、多態
Ⅰ.封裝:是把類的內部隱藏起來,以防止外部世界看見的一個物件導向的概念,通過關鍵字去控制變數,方法的存取權限。
1).存取修飾詞:
Ⅱ.繼承:
eg:我們建一個Person作為父類,Chinese作為子類
1 class Person 2 { 3 public string name="zhangsan"; 4 public int age=21; 5 //類裡面有一個預設的構造方法,我們在下面寫了一個構造方法,如果想去調用這個無參數的構造方法,那就要加一個無參構造方法 6 public Person() 7 { 8 Console.WriteLine("我是一個人類"); 9 }10 public void SayHi()11 {12 Console.WriteLine("hello,我是人類!");13 }14 }
Person
1 class Chinese:Person2 {3 4 }
Chinese
我們在程式入口裡面調用父類裡面的成員:
class Program { static void Main(string[] args) { Chinese c = new Chinese(); Console.WriteLine(c.name); Console.WriteLine(c.age); c.SayHi(); } }
Program
得到結果為:
1.為什麼子類裡面沒有成員,還能調用?
如果,我把person裡面的 [public string name="zhangsan";]變為私人成員[private string name;],調用結果顯示?
以上的得出結論:
繼承:
1.單繼承,一個類只能繼承一個類[一個兒子只有一個爹]
2.Chinese:Person Chinese 子類/衍生類別 Person 父類/基類/超類
3.Chinese:Person 那麼Chinese繼承了Person裡面所有的成員(欄位、方法),對於父類的私人成員,子類還是能繼承到,只是沒有存取權限
2).所有的類型的基類是System.Object類
3) . 建構函式不能被繼承
4).子類Chinese裡面添加一個方法
1 class Chinese:Person2 {3 public Chinese()4 {5 Console.WriteLine("我是中國人!");6 }7 }
Chinese
我們調用program看一下結果:
class Program { static void Main(string[] args) { Chinese c = new Chinese(); c.SayHi(); } }
Program
結果顯示:
4.當執行個體化子類對象時,首先調用父類的構造方法,然後調用子類的構造方法。
5).人類屬於動物類animal,我們建立一個animal類讓rerson類繼承。chinese繼承person,person繼承animal
class Animal { public Animal() { Console.WriteLine("我是動物類!"); } }
Animal
class Person:Animal { public Person() { Console.WriteLine("我是人類"); } public void SayHi() { Console.WriteLine("hello,我是人類!"); }
Person:Anima
class Chinese:Person { public Chinese() { Console.WriteLine("我是中國人!"); } }
Chinese:Person
結果顯示:
5.如果A:B,B:C,那麼A:C;
6).父類Person裡面有一個SayHi()方法,如果在子類裡面添加一個sayHi方法
class Chinese:Person { public Chinese() { Console.WriteLine("我是中國人!"); } public void SayHi() { Console.WriteLine("你好,我是中國人"); } }
Chinese裡添加一個SayHi方法
結果顯示:
我們來談一下過程:
ⅰ.繼承過來之後被隱藏,有意隱藏加一個關鍵字"new",如果加了關鍵字"new",就告訴子類,父類裡面的sayHi只能被隱藏,不能被覆寫
ⅱ.繼承過來之後被覆寫/重寫,覆寫需要在父類裡面加"virtual",加了"virtual"之後就告訴子類繼承之後,子類只能覆寫"override"
結果還是一樣,結論顯示:
6.一個子類和父類有相同的方法時,當運用子類的對象去調用該方法時,調用子類的方法,預設情況下,從父類的方法被隱藏掉,(有意隱藏,需要在子類的方法上加上New(可以加也可以不加))
如果想覆寫/重寫父類的方法,需要在父類裡面設定該方法為虛方法(virtual),然後子類通過override關鍵字去覆寫。
7).裡氏替換原則:一個父類的變數可以接收子類的對象,反之不行。
class Person:Animal { public Person() { Console.WriteLine("我是人類"); } public void SayHi() { Console.WriteLine("hello,我是人類!"); } }
Person
class Chinese:Person { public Chinese() { Console.WriteLine("我是中國人!"); } public void SayHi() { Console.WriteLine("你好,我是中國人"); } }
Chinese:Person
class Program { static void Main(string[] args) { //父類的變數可以接收到子類的任何類型 //如果沒有覆寫的話,就近原則,p離person近,就調用person的sayHi方法 Person p = new Chinese(); p.SayHi(); Console.ReadKey(); } }
Program
結果:
覆寫之後:
class Person:Animal { public Person() { Console.WriteLine("我是人類"); } public virtual void SayHi() { Console.WriteLine("hello,我是人類!"); } }
Person
class Chinese:Person { public Chinese() { Console.WriteLine("我是中國人!"); } public override void SayHi() { Console.WriteLine("你好,我是中國人"); } }
Chinese
結果:
得出:
7.子類和父類有相同的方法,預設情況下(沒有被覆寫),該變數調用該方法時,調用的是父類的方法(就近原則);
當子類覆寫該方法時,變數調用的是子類的方法。
8) .密封類 sealed class,不能被繼承的類
9).繼承的好處?
假設工廠要生產三孔的插座,它首先會把模型設計出來,模型裡面只是定義了方法,模型沒有寫方法的具體內容,把公用的方法抽象出來,做程式的時候先寫了一個介面,
讓下面的類繼承這個介面,這個介面並不實現具體的內容,只是定義方法名,返回的類型,具體實現什麼效果是在子類裡面override,所以繼承的好處就是把公用的東西抽象出 來,減少了代碼的重複性。
Ⅲ.多態 方法名相同,方法具體實現內容不同
1. 多態分為重載(overload)和覆寫(override)
重載:方法名相同,方法裡面的參數不同,參數的種類,個數或者順序不同。
2. 只有父類的虛方法(virtual)才能被子類覆寫,子類實現覆寫用關鍵字override,如果不加override就隱藏了父類的方法(需要加上關鍵字new,eg: public new static void Chinese())
3. 靜態方法不能被覆寫,但可以被隱藏
4. 靜態類裡面只能有靜態成員
5. 靜態成員不能帶override ,virtual ,abstract
c#重點[封裝,繼承,多肽]