C 物件導向學習筆記(一)

2021-08-29 21:10:23 字數 2836 閱讀 8006

這幾天,專案比較空一點,正在重點看一下c#基礎語法,感覺物件導向那一部分,有些地方還是滿疑惑的。

參考了《c#高階程式設計》第四版   第3和4章  邊看邊總結了點筆記

c#中的繼承(第4章 繼承)

1.繼承的型別

(1)實現繼承

表示乙個型別派生於乙個基型別,擁有該基型別的所有成員欄位和函式

(2)介面繼承

表示乙個型別只繼承了函式的簽名,沒有繼承任何實現**。

介面繼承通常被看作提供了一種契約,讓型別派生於介面,來保證為客戶提供某個功能

(3)多重繼承

c#不支援多重繼承,c#允許型別派生於多個介面

system.object是乙個公共基類,所以每個c#類(除object),都有乙個基類,還可以有任意多個基介面

(4)定義結構和類的總結:

結構總是派生於system.valuetype,還可以派生於任意多個介面

類總是派生於使用者選擇的另乙個類,還可以派生於任意多個介面

2.實現繼承

class a:b    a類派生於b類

set}

c#中虛方法可以在派生類中重寫,在呼叫方法時,會呼叫物件型別的合適方法

派生類重寫虛方法時要使用override關鍵字顯式宣告

成員欄位和靜態方法都不能宣告為virtual

(2)隱藏方法

如果簽名相同的方法在基類和派生類中都宣告,但該方法沒有宣告為virtual和override

那麼派生類方法會隱藏基類方法

同時c#會給出警告,使用new關鍵字宣告要隱藏乙個方法

在派生類方法前使用new,則可以關閉這個警告

當派生類方法前使用了new,而實際上該方法並沒有覆蓋基類的方法,那麼編譯器也會發出警告

(3)呼叫方法的基類版本

派生類中呼叫方法的基類版本:base.methodname()

也可以使用base() 來呼叫基類建構函式

以上主要討論了基類,派生類的方法,其規則也使用於屬性

(4)抽象類和抽象方法

abstract關鍵字

抽象類不能例項化

抽象方法沒有實現**,必須在非抽象的派生類中重寫(實際上抽象方法也是虛的,但不需要提供virtual)

如果類包含抽象方法,那麼該類也是抽象的,也必須宣告為抽象的 abstract

(5)密封類和密封方法

sealed關鍵字

對於類來說表示不能繼承該類

對於方法來說表示不能重寫該方法

注意:在方法上使用sealed是沒有意義的,除非該方法本身是某個基類上另乙個方法的重寫形式

如:class myclass

//methoda方法在基類中已經是乙個重寫形式

}//這裡的sealed 關鍵字其實就是確保了methoda在此處重寫的**是最終版本,其它人不能再重寫它了

class towclass:myclss

//錯誤,因為methoda方法不能被重寫

}如定義乙個新方法不想讓別人重寫,則首先就不要宣告為virtual

(6)派生類的建構函式

當沒有為類定義任何顯式的建構函式,編譯器會為所有的類提供預設的建構函式,並且能夠很好的

解決類層次結構中的所有問題

基類abstract class basea

子類class a:basea

描述例項化派生類時發生的情況:

假定預設的建構函式在整個層次結構中使用

編譯器首先找到它試圖例項化的類的建構函式,是a,而這個預設 a建構函式首先是為其直接基類basea執行預設

建構函式——》basea建構函式同樣繼續為其直接基類system.object執行預設建構函式

而system.object沒有任何基類,其建構函式執行,並把控制返回basea——》執行basea建構函式,將name初始化為null

控制權返回給a——》執行a建構函式,將id初始化為0,並退出

注意:建構函式的呼叫順序是先呼叫system.object,再按照層次結構由上向下進行,直到編譯器要例項化的類為止

每個建構函式都初始化它自己類中的字段

新增建構函式

第一:在層次結構中新增無引數的建構函式(用無引數的建構函式替換預設建構函式)

比如,要將上述basea class中的name初始化為"no name"

public abstract class basea }

當然針對此類,:base() 則可以不寫

因為編譯器在建構函式的「 

}這樣的情況,則在例項化a的時候,編譯出錯,因為編譯器為a生成的預設建構函式會試圖呼叫無引數的

basea建構函式,而由於basea中定義了帶引數的構造,所以basea中沒有預設的建構函式了.

因此,需要為派生類也提供乙個帶引數的建構函式來避免錯誤

如:class a:basea

}第三:過載建構函式和乙個類的層次結構

如:class a:basea

//建構函式2

public a(string name):this(name,"none")

}當執行 a a=new a("hello");就會呼叫 建構函式2 ,之後立即把控制權傳給對應的 建構函式1,這個函式帶2個引數

分別是"hello"和"none";在這個建構函式中依次把控制權傳給basea構造,該構造帶有1個引數——字串"hello".

然後繼續——》system.object預設建構函式

開始執行建構函式:首先system.object建構函式——》執行basea建構函式,初始化name

——》2個引數的a構造,初始化refname為"none"——》執行1個引數的a構造(什麼也不做)

在為類編寫自己的建構函式時遵循上述規則,則可以避免任何問題,順利初始化

物件導向程式設計(C )學習筆記一

類 class 是對結構體struct的增強,也是用於自定義型別的。struct object class object 將關鍵字struct改為class,增加訪問修飾符public object obj obj.a 11 obj.b 12 obj.c 13.0 obj.d 14.0 class ...

C 學習筆記(物件導向)

protected 受保護的 用protected宣告的成員稱為受保護的成員,它不能被類外訪問,但是可以被派生類的成員函式訪問 在類體中,既不寫關鍵字private,又不寫public,則預設為private 宣告類的方法是由宣告結構體型別的方法發展來的 在類體中直接定義函式時,不需要在函式名前邊加...

C 學習筆記 物件導向程式設計

1.什麼是類 物件和成員?類 乙個類包含很多的物件。比如人類就是乙個類,張 三 李四等是人類的物件,這些物件擁有人類共同的功能和資料,如身高 體重 年齡等,而具體化這些資料我們可看做是人類的成員變數。所以類是由若干個變數和相關函式組成,而物件則擁有這些變數和函式。2.如何宣告乙個類?類只有先宣告才能...