1. 程式人生 > 其它 >面向物件基礎(三)

面向物件基礎(三)

技術標籤:# 設計模式

文章目錄


—————————————————————————————————————————————

抽象類

把例項化沒有意義的父類,改成抽象類。把類和方法宣告為abstract,也就是抽象類和抽象方法。

注意:抽象類不能例項化;抽象方法是必須被子類重寫的方法;如果類中包含抽象方法,那麼類就必須定義為抽象類,無論是否包含其他一般方法。

考慮抽象類擁有儘可能多的共同程式碼,擁有儘可能受的資料。

抽象類通常代表一個抽象概念,它提供一個繼承的出發點,當設計一個新的抽象類時,一定是用來繼承的,所以,在一個以繼承關係形成的等級結構裡面,樹葉節點應當是具體類,而樹枝節點均應當是抽象類。

//加abstract關鍵字,表明是抽象類
abstract class Animal
{
    //在方法返回值前面加abstract,表明此方法是抽象方法,抽象方法沒有方法體,直接在括號後面加“;”
    protected abstract string getShoutSound();
}

介面

介面是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合,一旦類實現了介面,類就可以支援介面所指定的所有屬性和成員,宣告介面在語法上與宣告抽象類完成相同,但不允許提供介面中任何成員的執行方式,所以介面不可以例項化,不能有構造方法和欄位,不能有修飾符,不能宣告虛擬的或靜態的,還有實現介面的類必須要實現介面中的所有方法和屬性。

一個類可以支援多個介面,多個類也可以支援相同的介面。介面的命名,前面要加一個大寫的字母“I”,介面用interface宣告,介面中的方法或者屬性前面不能有修飾符、方法沒有方法體。

interface IChange
{
    string ChangThing(string thing);//宣告一個IChange介面,此介面有一個方法ChangThing,引數是一個字串變數,返回一個字串。
}
class MachineCat:Cat,IChange//機器貓繼承於貓,並實現IChange介面
{
    public MahcineCat():base()
    {}
    //實現介面的方法,注意不能加override修飾符
public string ChangThing(stirng thing) { //base.Shout()表示呼叫父類cat的方法 return base.Shout ()+"我有萬能口袋,我可以變出:"+thing; } }

客戶端程式碼

private void button_Click(object sender,EventArgs e)
{
    MachineCat mcat=new MacineCat("叮噹");//建立兩個類的例項
    StoneMonkey wukong =new StoneMonkey("孫悟空");
    
    IChange[]array=new IChange[2];//宣告一個介面陣列,將兩個類例項賦值給陣列
    array[0]=mcat;
    array[1]=wukong;
    
    //利用多型性,實現不同的changething
    MessageBox.Show(array[0].ChangeThing("各種各樣的東西"));
    MessgaeBox.Show(array[1].ChangeThing("各種各樣的東西"));
}

抽象類和介面的區別:

抽象類可以給出一些成員的實現,介面卻不包含成員的實現,抽象類的抽象成員可被子類部分實現,介面的成員需要實現類完全實現,一個類只能繼承一個抽象類,但可實現多個介面等等。

類是對物件的抽象,抽象類是對類的抽象,介面是對行為的抽象;如果行為跨越不同類的物件,可以使用介面,對於一些相似的類物件,用繼承抽象類;從設計角度講,抽象類是從子類中發現了公共的東西,泛化出父類,然後子類繼承父類,而介面是根本就不知道子類的存在,方法如何實現還不確認,預先定義。
(抽象類是自底而上抽象出來的,而介面是自頂向下設計出來的)

集合

陣列的優點:陣列在記憶體中連續儲存,因此可以快速而容易的從頭到尾便利元素,可以快速修改元素等。

缺點:建立時必須要指定陣列變數的大小,還有在兩個元素之間新增元素也比較困難。

集合和陣列
ArrayList是名稱空間,System.Collections的下一部分,它是使用大小可按需動態增加的陣列實現IList介面。
ArrayList的容量是ArrayList可以儲存的元素數,ArrayList的預設初始容量為0。隨著元素新增到ArrayList中。容量會根據需要通過重新分配自動新增。使用整數索引可以訪問此集合中的元素。此集合中的索引從零開始。

using System.Collections;//增加此名稱空間
public partial class Form1:Form
{
    IList arrayAnimal;//宣告一個集合變數,可以用介面IList,也可以直接宣告“ArrayList arrayAnimal”
    //動物報名按鈕事件
    private void button_Click(object sender,EventArgs e)
    {
        arrayAnimal=new ArrayList();//例項化ArrayList物件,注意這裡並沒有指定arrayAnimal的大小,與陣列不相同
        //呼叫集合的add方法增加物件,其引數是object,所以new cat和new dog都沒有問題。
        arrayAnimal.Add(new Cat("小花"));
        arrayAnimal.Add(new Cat(""));
        arrayAnimal.Add(new Cat(""));
        arrayAnimal.Add(new Cat(""));
        arrayAnimal.Add(new Cat(""));
        
        MessageBox.Show(arrayAnimal.Count.ToString());//隨著add物件的增加,集合的Count可以得到當前的元素個數。
    }
}
arrayAnimal.RemoveAt(1);//移除指定索引處的集合項。

裝箱和拆箱

裝箱就是把值型別打包到object引用型別的一個例項中。拆箱就是指從物件中提取值型別。

裝箱和拆箱過程需要進行大量的計算,對值型別進行裝箱時,必須分配並 構造一個全新的物件。其次,拆箱所需要的強制轉換也需要進行大量的計算。

泛型

泛型是具有佔位符(型別引數)的類、結構、介面和方法,這些佔位符是類、結構、介面和方法所儲存或使用的一個或多個型別的佔位符。泛型集合類可以將型別引數用作它所儲存的物件的型別的佔位符;型別引數作為其欄位和其方法的引數型別出現。

using System.Collections.Generic;//增加泛型集合的名稱空間
public partical class Form:Form
{
    IList<Animal>arrayAnimal;//關鍵在這裡,宣告一個泛型集合變數,用介面IList,注意IList<Animal>表示此集合變數只能接受Animal型別,其他不可以,也可以直接宣告List<Animal>arrayAnimal;
    
    //動物報名按鈕事件
    private void button_Click(object sender,EventArgs e)
    {
        arrayAnimal=new List<Animal>();//例項化list物件,注意,此時也需要指定list<I>的I是Animal
        
        arrayAnimal.Add(new Cat("小花"));
        arrayAnimal.Add(new Cat("小花"));
        arrayAnimal.Add(new Cat("小花"));
        arrayAnimal.Add(new Cat("小花"));
        arrayAnimal.Add(new Cat("小花"));
        
        MessageBox.Show(arrayAnimal.Count.ToString());
      }
}

List 和ArrayList在功能上一樣的,不同在於,它在宣告和例項化時都需要指定其內部項的資料或物件型別。
通常情況下,都建議使用泛型集合,因為這樣可以獲得型別安全的直接優點,而不需要從基集合型別派生並實現型別特性的成員,此外,如果集合元素為值型別,泛型集合型別的效能通常優於對應的非泛型集合型別(並優於從非泛型基集合型別派生的型別),因為使用泛型時不必對元素進行裝箱。

委託和事件

委託是對函式的封裝,可以當做給方法的特徵指定一個名稱,而事件則是委託的一種特殊形式,當發生有意義的事情時,事件物件處理通知過程。

委託是一種應用方法的型別,一旦為委託分配了方法,委託將與該方法具有完全相同的行為,委託物件用關鍵字delegate來宣告,而事件是說在發生其他類或物件關注的事情時,類或物件可通過事件通知他們,事件物件用event來宣告。

public delegate void CatShoutEventHandler();
//宣告一個委託,委託的名字叫做CatShoutEventHandler。
public event CatShoutEventHandler CatShout;
//宣告一個事件CatShout,它的事件型別是委託CatShoutEventHandler