繼承 多型 抽象類 介面

2021-06-16 17:06:31 字數 1850 閱讀 1657

繼承:

這個世界到處是繼承的例子比如動物是乙個最基礎的物件,人、豬、貓貓、狗狗都從動物繼承了基本的屬性和方法。繼承就是乙個層次結構,先抽象出乙個基本的東西,然後具體的物件從這個基本的東西來繼承,繼承後再寫他特有的,這樣就可以做到復用了。

隱藏:

如果基類和繼承類裡有一樣的方法,在子類裡呼叫的時候會怎麼樣,到底使用的是哪個呢?看,現在執行到了子類的drawme方法了,這樣就是子類把父類的那個方法給隱藏了,如果你要專門隱藏的話,最好在方法上加乙個關鍵字 new,這樣就不會有警告了,專門隱藏就是說子類的實現和父類中的完全不同,但我還想使用這樣的名字的時候就要用到這種了。

覆蓋:

比如基類中已經有了乙個方法了,但個方法和我想要的不同,我想重新寫乙個有自己特點的,這裡就有乙個覆蓋的概念,子類的方法覆蓋父類的方法後,呼叫時也會執行子類的方法。virtual,override就是覆蓋。

多型:

乙個物件根據執行期執行了那個物件,從而呼叫該物件的方法的能力就是多型。剛才例子中的 shape的乙個例項 指向了 矩形物件,也就是說,在執行期執行的時候shape實際上代表的是乙個矩形,而不是乙個圖形物件,說簡單點 就是我們把乙個子類的物件賦給父類物件後,多型就出現了。

我寫了乙個方法,引數是基類,那你呼叫的時候可以根據情況傳入不同的子類,這樣寫的**就非常靈活,不需要寫多個類似的**了,這樣做的好處是我的**可以寫一次就行了,如果加了薪的子類的話,我只需要加乙個類而已,那個方法是不用變的。

抽象類:

以前我們學的類都是具體的類,裡邊的屬性,方法都有具體的實現,但有時候基類裡的某些方法是沒有意義的 ,只能定義乙個方法,沒有具體的實現,這樣的類就是乙個抽象類。

形狀裡有個drawme的方法,對於形狀來說,他肯定不知道把自己畫成什麼樣子,只有具體的圖形才知道,所以我們把這個方法定義成抽象的。抽象類是無法進行new的,它不是具體的,抽象類只能被繼承,不能直接建立物件。

///

/// 表示乙個形狀的類,這個作為基類 abstract 表示這個物件是抽象的

///

public abstract class shape

//這裡定義乙個抽象的方法,裡面沒有任何實現,具體的實現在它的子類裡來處理

public abstract void drawme();

介面:

剛才我們定義了乙個抽象類,抽象類裡有乙個方法,這個方法對這個類來說實現沒有意義,只有子類裡才有意義,但為了統一繼承體系中的方法,需要在基類裡定義乙個方法,然後由子類來實現,這樣看起來所有繼承體系中的類都有一樣的方法,也就是說同乙個類,對外提供的方法是一樣的,但可以有自己特有的實現。

現在我們把抽象類更進一步,這個類裡中任何方法都是抽象的,沒有乙個實現,這樣就變成了乙個介面。介面你可以理解成乙個合同,比如你和某人簽了乙個合同,合同裡規定了你要做什麼什麼,但具體怎麼做有執行的人去實現 。

乙個類可以繼承另外乙個類,也可以繼承乙個抽象,也可以繼承乙個介面,c#裡只能從乙個類繼承,不能同時繼承多個類,但可以繼承多個介面,就像乙個類同時和很多介面簽了合同一樣。

物件導向有個很重要的原則就是面向介面程式設計,這是什麼意思呢,就是說我們先定義乙個介面,在程式裡用的時候都是介面,不用關心他具體的實現,如果說,現在有個乙個新的實現的話,我們的程式不需要修改,只加乙個實現該介面的類就ok了 ,可維護行很好。

///

/// 定義乙個介面 ,注意命名規範,介面以i開頭

/// 這個介面中定義了兩個沒有實現的方法,由繼承它的類來實現

///

inte***ce ishape

多型 抽象類 介面

抽象類介面 什麼是多型?同乙個物件,在不同時刻表現出來的不同形態 1.有繼承 實現的前提 2.有方法的重寫 3.有父類引用指向子類物件 例 animal a new cat 成員變數訪問 父類中有的屬性,才能正常編譯 編譯看左邊 如子類也有相同屬性,訪問執行出來的是父類中的屬性值 成員方法訪問 父類...

多型 抽象類 介面

同一物件,在不同時刻表現出來的不同形態 多型的前提和實現 有繼承 實現關係 有方法重寫 有父類引用指向子類物件 多型中成員訪問特點 成員變數 編譯看左邊,執行看左邊 成員方法 便宜看左邊,執行看右邊 為什麼成員方法和成員變數的訪問不一樣呢?因為成員方法有重寫,而成員變數沒有 多型的好處和弊端 好處 ...

多型 抽象類 介面

1.多型的使用方式 父類引用指向子類物件 同一型別的物件引用指向了不同型別的子類物件,具體方法的實現不同 呼叫的方法需要是子類和父類都有的,但是執行的是子類的,就是執行醫生類覆蓋的 重寫的 eat方法 也就是所謂的 編譯看左邊,執行看右邊!能夠呼叫什麼方法,取決於引用的型別,而方法中具體怎麼執行,要...