物件導向讀書筆記

2021-04-06 11:48:39 字數 4493 閱讀 6808

靜態類和非靜態類:

靜態類(靜態屬性等)是類所有的,非靜態類為類的例項所有的。

靜態類是類的所有例項所共享的,無論此類建立了多少例項,靜態類在記憶體中都只開闢了一塊儲存空間。

const常量也可以看成這種型別:

public class myclass

呼叫時可以直接myclass.kiss_my_class

類的宣告型別:

protected: 可以在派生的子類中訪問的

internal:只有其所在類才可以訪問(?)

abstract:不允許直接被例項化的類

sealed:不允許被繼承的類

方法的宣告型別:

virtual:抽象類裡必須的虛擬方法,以此來表明此類為乙個抽象類

sealed:不允許被繼承的方法

override:多型的一種,覆蓋,可以在直接使用父類的該方法base.***(e)的前提下,擴充套件自己的方法.

abstract:簡單的定義乙個型別,需要派生類具體來實現的抽象方法

extern:簡單的定義乙個型別

方法的引數型別:

值參:以此方法傳遞引數的,會copy乙份相同值傳入方法內部

引用參:ref int param1 直接將傳遞引數的實際值的位址傳入方法,而不會開闢新的儲存空間。param1需要被初始化

輸出參:out int param2 與ref不同的是,param2不需要被初始化,其它與ref相同

陣列參:params int param3 陣列參必須位於引數列表的最後,記憶體中為引數的最未開闢了乙個可變化的陣列儲存空間,此類引數不允許再帶有ref,out

過載:方法名相同,返回型別相同,而引數不同(個數或型別)的多個方法

操作符過載:

操作符過載的需求起於對不同型別的相加的功能擴充套件,給操作符定義以新的含義,在特定的類上做新的栓釋,比如傳入字串,則進行字串的相加,這和常規的僅限於整型的+是不同的,當然此類需求也可以擴充套件到業務類的相加。

可被過載的操作符為:

+ - * % / ++ --

true false

<< >> == != > < >= <=

! & | ^ ~

過載的方法(比如洛奇公升一級的加點,player為洛奇的玩家物件,我們用過載++來實現公升級的新含義)

public static player operator ++ (player _p)

再比如笛卡爾加法:

public static dkr operator + (dkr d1, dkr d2)

實現了這種類的相加:) 很好用吧。可以大大擴充套件我們的常規思維方法。

readonly:唯讀域只能夠在建構函式中進行修改

public static readonly string kiss_my_class = "oh, please kiss the class.";

public const string kiss_my_class = "oh, please kiss the class.";

以上兩句可以起到相同的效果

不同的是,const的表示式的值是在編譯時生成,而static readonly是在程式執行了之後才會被載入在記憶體中的。

所以在另乙個專案引用此dll時,如果kiss_my_class修改後,必須重新編譯此dll,才能得到新的常量,而如果為static readonly,則不用編譯即可以得到修改過的常量值。

事件:event

我們需要在button的過載中定義乙個事件的類ondoubleclick()

1. 首先需要宣告乙個eventhandler的委託類(和abstract類似,只需要宣告,不需要實現)

public delegate void eventhandler(object sender,eventargs e);//定義乙個委託的型別,event為eventhandler

public class button: control}}

索引器:

string _name = string[8];

public string this[int index]

set}

繼承:c#中的繼承規則.

1. 繼承可傳遞

2. 派生類應當是對基類的擴充套件

3. 建構函式與析構函式不能被繼承

4. 派生類如果定義了基類的同名成員,則基類的這些成員不能再被訪問

5. 派生類可以過載基類的虛方法,虛屬性和虛索引器,表現為多型

多型性:polymorphi**

同一操作對應不同的物件,有不同的解釋產生不同的結果。多型性可以通過過載基類中的虛函式型方法來實現。

過載虛方法,須使用override宣告型別,而不能有static,virtual,new的修飾符

抽象類:

抽象類為它的派生類提供了乙個公共的"介面",

抽象類的派生類若要實現它父類的方法,則必須使用override來進行覆蓋過載,抽象類與介面不同的是它還可以使用非抽象方法,即派生類override它的時候能使用base.***();來加入原型的成員,但如果是抽象方法則不能使用base來進行訪問。

抽象方法為抽象類中可以被其派生類過載的「介面」

如果在派生類中使用 public abstract override void func();

虛方法和抽象方法的區別:

抽象方法是沒有實際方法的介面函式,即只給子類提供了方法定義,需要子類進行實現,而虛方法可以有自己的實現;

實現虛方法時,直接public override void func(),且裡面可以用base.***()來載入原虛方法的內容,抽象類則不能。

抽象類一定要有乙個虛方法,而不需要有抽象方法.

今天又讀了一本"visual c#.net 技術內幕"的第一部分,有幾點對昨天的"

物件導向的筆記

"有意義的補充,現列出如下:

1. 常量:

數量的值僅可在編譯時指定,平時不允許更改,常量並不占用物件的空間,而被編譯到需要該常量的可執行**中。故無法對const前加static的修飾符,它們實際上並不與任何具體的物件有關聯。

2. 建構函式:

建構函式寢值設定項不能訪問this指標,因為此時this物件還沒有建立好.

初始化的順序:

a. 初始化全部靜態字段;

b. 呼叫靜態建構函式

c. 初始化全部例項字段

d. 呼叫例項建構函式

故需要先對靜態的字段進行賦值

internal的訪問級別表示僅可訪問封裝該成員的程式集內部的類

4. 強制型別轉換:

type1 type2 _m = (type2)_m;

在將子類賦給基類引用時,不需要進行強制型別轉換,因為子類總是可以取代基類,但相反的過程不成立 -> 即ztegir繼承了datagrid,則_zgr可以強制轉換為datagrid,但相反則不可以。(當然不可以 - -!誰知道老爸有多少個兒子呢)

除了這種強制轉換,還可以as關鍵字,可以嘗試性的進行型別轉換而不會引發型別轉換的異常(invalidcastexception),如:

ztegrid _zgr; //ztegrid繼承datagrid

datagrid _dgr = _zgr as datagrid;

//但是其後必須(是必須)判斷_dgr被轉換的物件是否為null,因為as關鍵字即使轉換失敗也不會引發異常,而只是賦予引用乙個null,從而可以根據程式來進行捕獲

if (_dgr != null)

5. 結構: struct

結構是一種聚合型別,它將多個不同型別的成員組合為一種新的型別。

1). 結構不能被繼承,不能繼承類和其它結構,但它可以繼承介面;

2). 與類的例項不同的是,永遠不會在堆中為結構的例項分配記憶體空間,它們是從堆疊分配記憶體的。(?堆是何概念? 與堆疊有啥區別)

3). 結構也能有成員函式與建構函式,但注意:結構的建構函式必須包含至少乙個引數

4). 結構不允許宣告析構函式

6. 列舉:可以避免未強型別的錯誤,我們可以將session,許可權串,型別等寫在列舉類裡,用color.red這樣來進行強型別取值。是一種良好的程式設計習慣。

列舉項的值是基於int的,且預設從0開始,我們也可以用指定第乙個項的值來指定列舉值的開始邊界.

7. 獲取型別資訊:

is: 檢測是否為指定,返回boolean常量 > if (obj is datagrid){}

typeof: 檢測型別資訊,返回system.type物件 > datagrid _grid = typeof(datagrid);

sizeof: 檢測值型別的大小,引用型別的大小無法測定(因其相當於乙個函式指標) > int size = sizeof(datagrid);

8. 運算子過載:須成對進行過載,比如你過載了 ==和!= 但沒過載object.equals和object.gethashcode方法,編譯器會報警告。

object.equals用來檢驗引用是否相等(注意會檢驗引用喔!而不只是值的相等性)

object.gethashcode()是乙個雜湊運算子組,它能使雜湊表和其他類似的集合資料型別正確分配。雜湊函式用於快速生成乙個與物件的值相對應的數字(hashcode)

讀書筆記 物件導向

看了譚云傑老師的 thinking in uml 一書,前面講解了物件導向的內容,特此編寫一下讀書筆記。封裝 繼承 多型 構造乙個更大更複雜的系統 復用 可拓展性增強 利於分工協作 更能專注某個功能點研究,需要考慮的資訊量大大減少。現實世界如何對映到乙個物件世界?物件世界如何描述現實世界?如何驗證物...

譚浩強 《C 物件導向》讀書筆記1

私有資料只能被本類中的成員函式呼叫,不能被除友元類之外的其他類呼叫。在宣告乙個引用型別變數時,必須同時使之初始化。引用型別變數始終與其代表的變數相聯絡,不能再作為其他變數的引用 別名 在對表示式 常量 不同型別引用時,必須用const 作宣告。int i 5 const a i 3 double d...

讀書筆記9 物件導向設計原則

單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。職責即為 變化的原因 開放封閉原則 軟體實體 類 模組 函式等 應該是可以擴充套件的,但是不可修改。對於擴充套件是開放的,對於更改是封閉的。關鍵是抽象,將乙個功能的通用部分和實現細節部分清晰的分離開來。理氏替換原則 子型別必須能替換掉他們的基...