OOP三大核心封裝繼承多態

OOP支柱javascript

個核心:封裝 繼承 多態java

封裝就是將實現細節隱藏起來,也起到了數據保護的做用。編程

繼承就是基於已有類來建立新類能夠繼承基類的核心功能。安全

在繼承中ide

另一種代碼重用是:包含/委託,這種重用不是父子類的繼承關係,而是一個類定義爲另外一個類的成員變量。函數

 

一個簡單的例子,汽車和收音機,汽車裏面有一個收音機,不能說繼承,不符合邏輯,只能說是一種對象包含了另外一個對象。汽車對象中調用了收音機對象中的方法。this

 

多態就是同一請求,不一樣的響應操做。spa

 

多態3d

同一種方式處理相關對象的能力。code

相同的請求操做不一樣。

兩個原則:里氏替換原則:子類對象可以替換其基類對象被使用。

開放封閉原則:對外擴展開放,對內修改封閉。

定義一個抽象方法,派生類重寫抽象方法具體實現。

 

Aniaml an=new Cat();//開闢一個新空間指向派生類對象

 

經過建立an 就能夠指向多個派生類對象。

 

an= new dog();

 

an=new chicken();

 

建立cat對象,基類指向子類

 

 

 

 

Public公共的沒有限制

 

Private私有的 本類可用

 

Protected 本類和子類使用

 

set get方法就是最基礎的封裝。

.NET語言提倡使用屬性來強制封裝狀態數據。屬性會老是映射到實際的訪問方法和修改方法。建立了屬性會在背後調用相應的get set來封裝。

封裝具備安全性,封裝能夠方便之後的修改。Get能夠表示具備只讀屬性,Set能夠表示具備只寫功能。

  

屬性內部表示

若是已經寫了封裝set get方法又從新定義了set get方法那麼編譯會出錯,基礎類庫會使用類型屬性而不是傳統的訪問和修改方法。

 

Public string company//封裝沒有括號()
{
 Get{return companyName;}
 Set(companyName=value;)
}//手動屬性

 

public int Num{get;set;}//自動屬性

自動屬性必修同時支持讀寫功能。

Const用來定義常量

好比我定義一個π

Public const double pai=3.14;

Ps:關鍵字都是加字數據類型前面

Readonly只讀字段 和常量類似 不能在賦初始值後改變。

但和常量也有不一樣的地方。

賦給只讀字段的值能夠在運行時決定,所以在構造函數中賦值是合法的。例如:

Class{

Public readonly double pi;

Public class(){

Pi=3.14;

}

}

 

繼承與多態

C#中定義冒號:操做類之間的關係。

例如:MiVan繼承Car

Class MiVanCar

{

}

MiVan能夠調用父類的公共屬性,繼承保護了封裝,沒法訪問私有成員。

.NET不容許多重繼承

能夠將類、結構或接口的定義拆分到兩個或多個源文件中,在類聲明前添加partial關鍵字便可。

Sealed關鍵字

防止發生繼承

建立子類對象訪問基類功能,並擴展。

 

Base關鍵字

靜態成員只能由類來訪問,不能由對象來訪問。

Basethis都是訪問類的實例

 

 

 

通常基類的默認構造函數會被自動調用

 上述例子,顯示調用合適的自定義基類構造函數。解決只讀問題和低效性。增長了自定義的構造函數,就把默認的構造函數自動移除了,因此得從新定義默認構造函數。

 

基類加Protected關鍵字

好處:派生類就能夠直接訪問基類的信息。

壞處:有可能繞過公共屬性設置的業務規則。

受保護的數據被認爲是私有的。

 

包含/委託編程

Has-a關係

簡單的說,委託就是增長公共成員到包含類,以便使用被包含對象的功能。

 

非嵌套類不能使用private關鍵字聲明。

Public class OuterClass

{

//公共嵌套類型能夠被任何人使用

Public class PublicInnerClass()

//私有嵌套類型只能夠被包含類的成員使用

Private class PrivateInnerClass()

}

 

C#多態

相同的請求作出不一樣的響應。

若是基類但願定義由子類重寫的方法,必須加上virtual關鍵字。

若是子類但願改變虛方法的實現細節,必須使用override關鍵字。

能夠經過base關鍵來使用默認行爲

例如:

Base.GiveBonus();

使用了基類的默認行爲。

 

抽象類

防止建立模糊的基類,使用abstract關鍵字。

Abstract class Employee

{

 

}

構建多態接口

抽象方法只能夠在抽象類中

dynamic 相似於javascript中的Var 弱類型(與底層打交道會用的到)

相關文章
相關標籤/搜索