C#物件的三個特點:封裝,繼承,多型, 以及c#中隱藏(new)和方法重寫(override)和過載(overload)的區別
封裝
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) 子類不光繼承父類的公有成員,同時繼承了父類的私有成員,只是在子類中不被訪問。
特點:
c#中隱藏(new)和方法重寫(override)和過載(overload)的區別
過載、重寫和隱藏的定義:
過載:同一個作用域內發生(比如一個類裡面),定義一系列同名方法,但是方法的引數列表不同。這樣才能通過傳遞不同的引數來決定到底呼叫哪一個。而返回值型別不同是不能構成過載的。
重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的
例如:基類方法宣告為virtual(虛方法),派生類中使用override申明此方法的重寫.
隱藏:基類方法不做申明(預設為非虛方法),在派生類中使用new宣告此方法的隱藏。
過載時,根據引數選擇呼叫的方法;
重寫時,訪問父類子類皆呼叫子類的重寫方法;
隱藏時,訪問父類則呼叫父類的方法,子類子類的方法。
隱藏(new)示例:
using System;
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)父類引用指向子類物件,當父類想使用子類中特有屬性、方法時,要向下轉型。