這些基礎卻重要的面向對象概念,你還記得多少

面向對象概念一覽:html

對象,類,構造方法,方法重載,屬性,字段。編程

面向對象三大特性:封裝,繼承,多態數組

抽象類,接口安全

集合,裝箱拆箱ide

這些概念你還記得多少?函數

有不清楚的就往下看吧,溫故而知新。性能

 

整理以下:學習

對象 是一個自包含的實體,用一組可識別的特性和行爲來標識。編碼

面向對象編程 Object-Oriented Programming設計

 

類 就是具備相同的屬性和功能的對象的抽象的集合。

 

構造方法,又叫構造函數,其實就是對類進行初始化。

構造方法與類同名,無返回值,也不須要void,在new的時候調用。

全部類都有構造方法,若是你不編碼則系統默認生成空的構造方法,若你有定義的構造方法,那麼默認的構造方法就會失效了。

 

方法重載 提供了建立同名的多個方法的能力,但這些方法須要使用不一樣的參數類型。

方法重載時,方法名相同,但參數類型或個數必須不一樣。

方法重載可在不改變原方法的的基礎上,新增功能。

 

屬性 是一個方法或一對方法,但在調用它的代碼看來,它是一個字段,即屬性適合於以字段的方式使用方法調用的場合。

字段 是存儲類要知足其設計所須要的數據,字段是與類相關的變量。

屬性有兩個方法 get 和 set . 

get訪問器返回與聲明的屬性相同的數據類型;

set訪問器沒有顯式設置參數,但它有一個隱式參數value, 它的做用是調用屬性時能夠給內部的字段或引用賦值。

變量私有的叫字段,公有的是屬性,那麼對方法而言,一樣也就有私有方法和公有方法。

 

面向對象三大特性:封裝,繼承,多態

封裝

每一個對象都包含它能進行操做所須要的全部信息,這個特性稱爲封裝,所以對象沒必要依賴其餘對象來完成本身的操做。

封裝有不少好處:減小耦合;類內部的實現能夠自由地修改;類具備清晰的對外接口。

 

繼承

對象的繼承表明了一種 is-a 的關係,若是兩個對象 A和B, 能夠描述爲 B是A , 則代表 B 能夠繼承 A

實際上,繼承者還能夠理解爲是對被繼承者的特殊化,由於它除了具有被繼承者的特性外,還具有本身獨有的個性。

繼承定義了類如何相互關聯,共享特性。

繼承的工做方式是定義父類和子類,或叫作基類和派生類,其中子類繼承父類的全部特性。子類不但繼承了父類的全部特性,還能夠定義新的特性。

學習繼承記住三句話:

1.子類擁有父類非private的屬性和功能;

2.子類具備本身的屬性和功能,即子類能夠擴展父類沒有的屬性和功能;

3.子類還能夠以本身的方式實現父類的功能(方法重寫)。

在C#中子類從它的父類中繼承的成員有 方法、域、屬性、事件、索引指示器。

但對於構造方法,有一些特殊,它不能被繼承,只能被調用。

對於調用父類的成員,能夠用base關鍵字。例如:

public Cat(string name) : base(name)

{}

如上例子,子類構造方法須要調用父類一樣參數類型的構造方法,用base關鍵字表明父類

繼承是有缺點的,父類變,則子類不得不變;另外,繼承會破壞封裝,父類實現細節暴露給子類,增大了兩個類之間的耦合性。

繼承顯然是一種類與類之間強耦合的關係。

不要濫用,當類具有 is-a 的關係, 考慮用繼承。

 

多態

多態表示不一樣的對象能夠執行相同的動做,但要經過它們本身的代碼來執行。

1.子類以父類身份出現

2.子類在工做時以本身的方式來實現

3.子類以父類的身份出現時,子類特有的屬性和方法不可使用

 

如何使用:虛方法和方法重寫。

一般虛擬的是方法,但其實除了字段不能是虛擬的,屬性、事件和索引器均可以是虛擬的。

子類能夠選擇使用override關鍵字,將父類實現替換爲本身的實現,這就是方法重寫Override,或者叫作方法覆寫。

注意:對象的聲明必須是父類,而不是子類,實例化的對象是子類,這才能實現多態。

多態的原理是當方法被調用時,不管對象是否被轉換爲其父類,都只有位於對象繼承鏈最末端的方法實現會被調用。

也就是說,虛方法是按照其運行時類型而非編譯時類型進行動態綁定調用的。

 

抽象類

考慮把實例化沒有任何意義的父類,改爲抽象類。

C#容許把類和方法聲明爲 abstract, 即抽象類和抽象方法。

注意:

1.抽象類不能實例化

2.抽象方法是必須被子類重寫的方法

3.若是類中包含抽象方法,那麼類就必須被定義爲抽象類,不管是否還包含其餘通常方法

 

讓抽象類擁有儘量多的共同代碼,擁有儘量少的數據。

抽象類一般表明一個抽象概念,它提供一個繼承的出發點,當設計一個新的抽象類時,必定是用來繼承的。

因此,在一個以繼承關係造成的等級結構裏面,樹葉節點應當是具體類,而樹枝節點均應當是抽象類。

 

接口

接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。

一旦類實現了接口,類就能夠支持接口所支持的全部屬性和成員。

聲明接口在語法上與聲明抽象類徹底相同,但不容許提供接口中任何成員的執行方式。

因此接口不能實例化,不能有構造方法和字段;不能聲明虛擬的或靜態的等。

實現類就必需要實現接口中的全部方法和屬性。

接口中的方法或屬性前面不能有修飾符、方法沒有方法體。例子:

public interface IBankAccount

{

void PayIn(decimal amount);

bool Withdraw(decimal amount);

decimal Balance

{

get;

}

}

抽象類和接口的區別:

從表象上來講,抽象類能夠給出一些成員的實現,接口卻不包含成員的實現;

抽象類的抽象成員可被子類 部分實現,接口的成員須要實現類 徹底實現;

一個類只能繼承一個抽象類,但可實現多個接口等等。

三點幫助區分抽象類和接口:

1. 類是對對象的抽象;抽象類是對類的抽象;接口是對行爲的抽象

2. 若是行爲跨越不一樣類的對象,可以使用接口;對於一些類似的類對象,用繼承抽象類

3. 從設計角度講,抽象類是從子類中發現了公共的東西,泛化出父類,而後子類繼承父類;

    而接口是根本不知子類的存在,方法如何實現還不確認,預先定義。

 

抽象類是自底向上抽象出來的,而接口是自頂向下設計出來的。

 

集合

數組優勢, 好比說數組在內存中連續存儲,所以能夠快速而容易地從頭至尾遍歷元素,能夠快速修改元素等等。

數組缺點,建立時必需要指定數組變量的大小,還有兩個元素之間添加元素也比較困難。

.NET Framework 提供了用於數據存儲和檢索的專用類,這些類統稱集合

這些類提供對堆棧、隊列、列表和哈希表的支持。大多數集合實現相同的接口。

介紹經常使用的一種:ArrayList

ArrayList 是命名空間 System.Collections 下的一部分, 它是使用大小可按需動態增長的數組實現IList接口。

ArrayList 的容量是 ArrayList 能夠保存的元素數。 ArrayList 的默認初始容量爲0。

隨着元素添加到 ArrayList中,容量會根據須要經過從新分配自動增長。

使用整數索引能夠訪問此集合中的元素。此集合中的索引從零開始。

例子:

IList arrayAnimal;

arrayAnimal = new ArrayList();

arrayAnimal.Add(new Cat("小花"));

。。。

 

ArrayList不是類型安全的。須要使用裝箱拆箱操做,帶來性能損耗。

裝箱:把值類型打包到Object引用類型的一個實例中。

int i = 123;

object o=(object)i; // boxing

拆箱:從對象中提取值類型。

i=(int)o; // unboxing

 

泛型是具備佔位符(類型參數)的類、結構、接口和方法。

使用泛型解決類型不安全及裝拆箱性能損耗問題。

泛型集合使用 System.Collections.Generic 的命名空間

List 類就是 ArrayList 類的泛型等效類。

該類使用大小可按需動態增長的數組實現 IList 泛型接口。

IList<Animal> arrayAnimal;

arrayAnimal = new List<Animal>();

arrayAnimal.Add( new Cat("小花"));

 

說明:

經常用List代替ArrayList, 其實 List 和 ArrayList 在功能上是同樣的。

不一樣就在於, 它在聲明和實例化時都須要指定其內部項的數據或對象類型,這就避免了類型安全問題和裝箱拆箱的性能問題。

一般狀況下,都建議使用泛型集合。

 

轉自:http://www.cnblogs.com/miro/p/4835652.html

相關文章
相關標籤/搜索