OOP支柱javascript
3 個核心:封裝 繼承 多態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 MiVan:Car
{
}
MiVan能夠調用父類的公共屬性,繼承保護了封裝,沒法訪問私有成員。
.NET不容許多重繼承
能夠將類、結構或接口的定義拆分到兩個或多個源文件中,在類聲明前添加partial關鍵字便可。
Sealed關鍵字
防止發生繼承
建立子類對象訪問基類功能,並擴展。
Base關鍵字
靜態成員只能由類來訪問,不能由對象來訪問。
Base和this都是訪問類的實例
通常基類的默認構造函數會被自動調用
上述例子,顯示調用合適的自定義基類構造函數。解決只讀問題和低效性。增長了自定義的構造函數,就把默認的構造函數自動移除了,因此得從新定義默認構造函數。
基類加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 弱類型(與底層打交道會用的到)