封裝
1)封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問,通常有兩種訪問方式:set 設置,get 獲取。
2)封裝結果:存在但是不可見。
3) 訪問修飾符
聲明的可訪問性 含義
public 訪問不受限制。
protected 訪問僅限於本類或者其子類(可以跨程序集)。
private 訪問僅限於本類。
internal 訪問僅限於當前程序集。
protected internal 本類或者同一個程序集或者子類(可以跨程序集)里面訪問
注意:對字段和方法而言 默認是私有的 但是對類而言 默認是internal
4)封裝:是把類的內部隱藏起來,以防止外部世界看見的一個面向對象的概念
5) 重構(這里大家多多補充)
class Class1
{
private int i = 1;
public int I
{
get { return i; } //只允許外部類讀取屬性
set { i = value; } //只允許外部類寫入屬性
}
}
繼承
父子概念的繼承:圓繼承於圖形,圓是子概念(子類型 Sub class)圖形是父類型(Super Class也叫超類),繼承在語法方面的好處:子類共享了父類的屬性和方法的定義,子類復用了父類的屬性和方法,節省了代碼。
繼承是is a :“是”我中的一種,一種所屬關系。
子類型對象可以賦值給父類型變量(多態的一種形式),變量是代詞,父類型代詞可以引用子類型東西。
(1) 被繼承的類稱為基類或父類,而繼承得到的類稱為子類或派生類。子類繼承超類的狀態和行為,同時也可以具有自己的特征。
(2) 所有的類型的基類是System.Object類
(3) class A : B
(4) A:B B:C 則 A:C
(5) 構造函數不能被繼承
(6) 一個子類只能繼承與一個父類
(7) 使用sealed關鍵字,其他類無法繼承此類
(8) 子類不光繼承父類的公有成員,同時繼承了父類的私有成員,只是在子類中不被訪問。
特點:
重載、重寫和隱藏的定義:
重載:同一個作用域內發生(比如一個類里面),定義一系列同名方法,但是方法的參數列表不同。這樣才能通過傳遞不同的參數來決定到底調用哪一個。而返回值類型不同是不能構成重載的。
重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的
例如:基類方法聲明為virtual(虛方法),派生類中使用override申明此方法的重寫.
隱藏:基類方法不做申明(默認為非虛方法),在派生類中使用new聲明此方法的隱藏。
重載時,根據參數選擇調用的方法;
重寫時,訪問父類子類皆調用子類的重寫方法;
隱藏時,訪問父類則調用父類的方法,子類子類的方法。
隱藏(new)示例:
class A
{
public void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
new public void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main(string[] args)
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
輸出為
B.F
A.F
重寫virtual(虛方法)示例
using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
輸出為
B.F
B.F
補充:重寫override一般用於接口實現和繼承類的方法改寫,要注意
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
多態
1)繼承體現了多態:父類型變量可以引用各種各樣的子類型實例,也可接收子類對象。
2)個體的多態:父類型的子類型實例是多種多樣的。
行為的多態:父類型定義方法被子類重寫為多種多樣的,重載也是多態的方法。
千萬不能出現將父類對象轉成子類類型,會造型異常!
3)多態前提:必須是類與類之間有關系。要么繼承,要么實現。通常還有一個前提:存在覆蓋。
4)多態的好處:多態的出現大大的提高程序的擴展性。
多態的弊端:雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員。
5)在多態中成員函數的特點:
①在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。如果有,編譯通過,如果沒有編譯失敗。
②在運行時期:參閱對象所屬的類中是否有調用的方法。
③簡單總結就是:成員方法在多態調用時,編譯看左邊,運行看右邊。
6)在多態中,成員變量的特點:無論編譯和運行,都參考左邊(引用型變量所屬的類)。
7)在多態中,靜態成員方法和屬性的特點:無論編譯和運行,都參考做左邊。
8)父類引用指向子類對象,當父類想使用子類中特有屬性、方法時,要向下轉型。