VS派生類
- 繼承。派生類
class AClass : FClass
構建函數繼承 public classname (string astring): base(astring){};默認不繼承基類的構建函數。基類的在前面執行,然后執行派生類構建函數中的代碼。
- 多態性
即看對象變量引用的是哪個類的實例,優先用對應類的方法,如果沒有,到基類找。
一說同名操作,有多種,包含重載、重寫、隱藏方法等
重寫即派生類重寫基類方法
基類定義允許重寫
public virtual viod methodname(){}
派生類重寫
public override viod methodname(){}
方法名必須相同;參數列表必須相同;相同的返回值;存取權限相同
- 隱藏基類成員
用於版本,用new定義
隱藏域
基類 public string astring;
派生類public new string astring;
隱藏方法
參數必須相同。
基類public classname(string:astring);
派生類public new classsname(string:astring);
(1)隱藏方法不但可以隱藏基類中的虛方法,而且也可以隱藏基類中的非虛方法。
(2)隱藏方法中父類的實例調用父類的方法,子類的實例調用子類的方法。
(3)和上一條對比:重寫方法中子類的變量調用子類重寫的方法,父類的變量要看這個父類引用的是子類的實例還是本身的實例,如果引用的是父類的實例那么調用基類的方法,如果引用的是派生類的實例則調用派生類的方法。
- 區別隱藏和重寫
“重寫”:允許使用現有成員的一個新實現代替基礎類實現。換句話說就是允許使用自己的實現代替相
同名稱的一個基類成員。
“隱藏”:可以模糊一個基類的成員並用一個完全不同的新實現代替它。
“重寫”:在基類中要被重寫的方法要修飾為virtual,在子類中該方法要被修飾為overrride。
新實現的方法必須與要被重寫的方法有相同的函數名,函數簽名,返回類型以及
訪問級別。(簡單來說就是除了virtual/override,其他函數聲明完全一致)
“隱藏”:子類中的方法要被修飾為new
子類中的方法與要被隱藏的方法有相同的函數簽名並且是相同種類的成
員,但是它可以擁有不同的訪問級別,返回類型以及函數實現 。
“重載”:一個重載的方法必須擁有於先前存在的方法有相同函數名字,而且必須擁有不同
的函數簽名,至於返回類型和訪問級別可以相同也可以不同
任何擁有於先前存在的方法相同的函數名,不同色調簽名方法,都將被看做是那個方法的一個重載並且不會隱藏先前存在的方法
如果一個繼承類被強制轉換為的他的一個基類並且一個重寫的方法被調用:
if 新的方法是重寫的,則對象的類型決定那個方法被調用,而不是變量。
這種情況下繼承類的方法被調用
if 新的方法是隱藏的,則變量的類型決定那個方法被調用,而不是對象。
這種情況下基類的方法被調用
- 抽象方法
在基類中定義的並且必須在派生類中重寫的方法,
在基類使用abstract關鍵字定義
在派生類使用overide關鍵字定義
- 版本
定義了基類虛方法后,子類定義同名方法,但沒寫new或override,會出現編譯錯誤,所以子類要定義關鍵字。
- System.Object類
所有類都隱含從這個類派生。
比較有用的方法有。ToString(),返回一個與對象的類名相等的字符串,mycar.ToString()等於類名Car;靜態方法Equals(object,object),Car.Equals(mycar,myothercar),對比兩個對象是否相等;靜態方法ReferenceEquals(object,object),對比兩個對象引用是否引用同一個對象,Car.ReferenceEquals(mycar,myothercar);GetType()返回對象的類,或返回變量的類型,mycar.gettype()返回類名;Finalize(),允許對象在垃圾收集器從內存刪除對象之前進行清除工作;MemberwiseClone,創建對象的拷貝,mycar.MemberwiseClone返回拷貝對象。
比如,可在類中重寫虛方法ToString,實現返回一個域值
- 重載System.Object類方法
因為都是從System.Object類繼承,所以可重載System.Object類的虛方法virtual
- 包裝和解包
包裝:把變量隱式包裝成一個system.object對象,簡寫成object
解包:把變量包裝的object對象,解包成變量。
int myint =10;
可顯示寫成
int myint =10;
object myobject = myint;這里是包裝
int myint2 = (int)myobject;這里是解包
因為有隱含的包裝和解包,可以像使用對象一樣使用變量,如myint.tostring(),如myint.gettype()。
- 抽象類和抽象方法
抽象類用abstract,代表概念,可派生出代表實際的類
抽象方法也是abstract,在派生類中,這個方法必須被重寫,並必須包含代碼。
特點,不能創建抽象類的對象;不能標記構建函數為抽象的;可以用抽象類派生另一個類(包括抽象類);必須在派生類用代碼重寫基類的抽象方法。
- 密封類和方法sealed
密封類和密封方法限制繼承和多態。即不能繼承密封類,不能重載重寫密封方法。在public等前加sealed
- 強制轉換對象
基類和派生類之間可互相轉換,可跨級轉換,只要其中一個類是另一個類的基類或更上級基類。
轉換后的效果是,只能存取轉換后的類的成員了。
向上轉換,轉換成基類fatherclass myfatherclass = (fatherclass) mychildclass;
向下轉換,轉換成派生類 childclass mychildclass = (childclass )myfatherclass;
- 存取訪問限制
- 重載運算符
重寫算術運算、比較值等。
比如==,當比較對象時,其實比較的是對象變量的引用,如果想比較對象的實例域,就不能用默認的靜態的==了,可以用重寫默認的靜態的==,如果重寫了==和Equals,就必須重寫!=,即重寫了一個運算符,就必須重寫與其相對的運算符,如==和!=,<和>。
public static bool
operator == (class1 myclass1,class2 myotherclass1){}
比如+,當比較對象時,會編譯報錯,因不能簡單的加兩個對象,可以重寫+,實現加對象的實例域的值。
public static class1
opertator +(class1 myclass1,class2 myotherclass1){}