1. 程式人生 > >為什麼要使用抽象類 介面程式設計以及有什麼好處

為什麼要使用抽象類 介面程式設計以及有什麼好處

首先舉個例子 假設某動物園管理員每天需要給他所負責飼養的獅子、猴子和鴿子餵食。我們用一個程式來模擬他餵食的過程。 先用常規類程式設計方式 飼養員用一個 Feeder() 類來表示,三個動物分別是:class Monkey() ,class Pigeon()  ,class Lion()
//飼養員類
class Feeder
{
 	void FeedMonkey(Monkey m)
	{
   		m.eat()
	}
        ...
        ...
        ...
}

飼養員餵食的過程如下:
static void Main(string[] args)
{
Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();

Feeder f = new Feeder();

f.FeedMonkey(m); //喂猴子
f.FeedPigeon(p); //喂鴿子
f.FeedLion(l); //喂獅子
}
如果動物園領導看伺養員工作努力,又把大熊貓交給他管理。這時,我們的程式不得不給
Feeder 類增加第四個方法: FeedPanda()。
萬一飼養員後來又不管理鴿子了,那不又得從 Feeder 類中刪除 FeedPigeon()方法嗎?
這種程式設計方式很明顯是不合理的。 很明顯,獅子、猴子和鴿子都是一種動物,因此,可以建立一個 Animal 抽象基類,讓獅子、猴子和鴿子從其派生出來 由於不同的動物吃不同的食物,所以在 Animal 類中定義一個抽象的 eat()方法,由子類負責實現此方法。
abstract class Animal
{
	public abstract void eat();
}
//獅子
class Lion:Animal
{
	public override void eat()
	{
		//吃肉
	}
}
//猴子
class Monkey:Animal
{
	public override void eat()
	{
		//吃香蕉
	}
}
//鴿子
class Pigeon:Animal
{
	public override void eat()
	{
		//吃大米
	}
}
伺養員類如下:
//動物園飼養員
class Feeder
{
        //抽象類做為引數(同樣也可以是介面引數)
	public void FeedAnimal(Animal animals)
	{
		animals.eat();
	}
}
現在餵養過程變為:
static void Main(string[] args)
{
Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();
Feeder f = new Feeder();
f.FeedAnimal(m);//喂猴子
f.FeedAnimal(p);//喂鴿子
f.FeedAnimal(l);//喂獅子
}
簡化後的程式碼變得非常簡潔。對比最早的使用三個獨立方法實現的方法,新程式碼擴充套件性大大增強。不管有幾種動物,只需要建立動物類,飼養員 Feeder 類的 FeedAnimals 方法不用改就可以使用。 還一個好處就是在專案的開始期,設計好抽象類Animal,不必等到各子類完成eat()等方法,大家就可以協同工作了。
以上大家可以明白為什麼使用抽象類程式設計或者使用抽象類程式設計的好處了吧。

相關推薦

為什麼使用抽象 介面程式設計以及什麼好處

首先舉個例子 假設某動物園管理員每天需要給他所負責飼養的獅子、猴子和鴿子餵食。我們用一個程式來模擬他餵食的過程。 先用常規類程式設計方式 飼養員用一個 Feeder() 類來表示,三個動物分別是:class Monkey() ,class Pigeon()  ,class

介面抽象,區別以及使用場景

順便做個記錄 介面和抽象類應該是Java語法中最常見的兩個概念 關於兩者,網上也是一搜一噸的對比,總體如下: 1,抽象類的成員可以具有訪問級別 介面的成員全部public級別 2,抽象類可以包含欄位 介面不可以 3,抽象類可以繼承介面 介面不能繼承抽象類

抽象 介面 以及修飾符的總結

1、抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問修飾符修飾。原因如下:抽象方法沒有方法體,是用來被繼承的,所以不能用private修飾;static修飾的方法可以通過類名來訪問該方法(即該方法的方法體),抽象方法用st

C#.NET裏面抽象和接口什麽區別

end 吃飯 動物 虛方法 根據 自定義 private this sse 1.面向接口編程和面向對象編程是什麽關系 首先,面向接口編程和面向對象編程並不是平級的,它並不是比面向對象編程更先進的一種獨立的編程思想,而是附屬於面向對象思想體系,屬於其一部分。或者說,

java—抽象和接口什麽區別

單繼承 另一個 ava div 部分 ati 使用 同時 靜態代碼塊 簡單的說,使用abstract修飾的類就是抽象類,抽象類中可以不包含抽象方法(由abstract修飾的方法),抽象類中也可以包含普通類中的方法和成員變量。一個普通類繼承抽象類則必須實現該抽象類中的所有抽象

深入理解接口和抽象的區別以及使用

靜態方法 因此 解決辦法 stat 繼承 功能 fun 抽象方法 調用 感覺這篇文章對於接口和抽象類的理解非常有幫助!故抄襲下來,留存。 對於面向對象編程來說,抽象是它的一大特征之一。在Java中,可以通過兩種形式來體現OOP的抽象:接口和抽象類。這兩者有太多相似的地方,又

抽象,多態以及接口的知識內容梳理

名稱 單繼承 異常 nim err 返回值 接口編程 自定義常量 static 抽象類的格式abstract class 父類名(Animal){}抽象方法的格式:public abstract(必須寫) 方法名() ;註意:1)如果一個類中有抽象方法,那麽這個類一定抽象

抽象和接口什麽區別

.net control style isp detail tails tro 方法 csdn JDK7中抽象類和接口的區別 JDK8新特性:接口的靜態方法和默認方法 抽象類和接口有什麽區別

static final 抽象 介面

靜態 static 靜態方法中呼叫的特點 1 在靜態方法中只能呼叫靜態方法 2 在靜態方法總只能呼叫靜態變數 非靜態方法中呼叫的特點 可以呼叫靜態和非靜態 注意許可權修飾符問題 當一個方法是靜態方法的時候 私有化不可以 可以直接通過類名呼叫 當一個屬性是靜態的時候 (跨包 預設) 不

java基礎-抽象/介面

抽象類:包含抽象方法的類叫抽象類。抽象方法由 abstract修飾。有抽象方法的類也必須由abstract修飾。 抽象方法:在抽象類內部不給予實現。當有一個類,繼承了當前的抽象方法後需要實現。抽象方法不能被private修飾(修飾意味著不能被別的類繼承,而抽象方法又必須被繼

java基礎個人筆記之抽象,介面與多型,內部類

抽象類: 抽象:籠統,模糊,看不懂!不具體。 特點: 1,方法只有宣告沒有實現時,該方法就是抽象方法,需要被abstract修飾。 抽象方法必須定義在抽象類中。該類必須也被abstract修飾。 2,抽象類不可以被例項化。為什麼?因為呼叫抽象方法沒意義。 3,抽象類必須有其子類覆蓋了所有

day10 01_,抽象,介面的綜合小練習,02_形式引數和返回值的問題深入研究,03_包的概述和講解,04_修飾符的概述和總結,05_內部類概述和講解

01_類,抽象類,介面的綜合小練習 /* 教練和運動員案例(學生分析然後講解) 乒乓球運動員和籃球運動員。 乒乓球教練和籃球教練。 為了出國交流,跟乒乓球相關的人員都需要學習英語。 請用所學知識: 分析,這個案例中有哪些抽象類,哪些介面,哪些具體類。 整個分析過程,我是通過畫圖講解的。 */

抽象,介面,多型,向上(下)轉型,內部類

抽象類:    因為繼承的關係,子類的功能可以越來越具體,相對來說,父類   更加一般化,通用化。因為父類封裝了子類的共同行為,所以,  在定義時,我們可以定義方法的邏輯。有的時候,在父類中無法完成  子類的功能需求,此時,不如不寫,即不寫方法體,程

java 多型, 抽象, 介面

1. 繼承 2. 重寫 3.父類引用指向子類物件 傳遞子類物件 當呼叫父類被重寫的方法時,實際new的是什麼子類物件就呼叫哪個子類物件的方法 執行期間,根據實際物件來呼叫,而不是父類引用。所以叫動態繫結,也叫多型 既然父類的方法註定要被重寫,那就沒有必要寫實現了,就可以將他定

09 面向物件_多型&抽象&介面

09.01_面向物件(多型的概述及其程式碼體現) A:多型(polymorphic)概述 事物存在的多種形態 B:多型前提 a:要有繼承關係。 b:要有方法重寫。 c:要有父類引用指向子類物件。 C:案例演示 程式碼體現多型 class D

Java學習筆記 抽象 介面 多型

instanceof 物件名 instanceof 類名 該物件是否屬於該類 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = (Dog)animal; } 多型 Animal

抽象&介面&繼承

一.抽象類 1.抽象類: 定義:只約定類所具有的抽象行為,沒有具體實現相應的功能的物件 使用原則: (1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public; (2)

java_集合體系之Collection框架相關抽象介面詳解、原始碼——02

java_集合體系之Collection框架相關抽象類介面詳解、原始碼——02 一:Collection相關介面、抽象類結構圖   二:Collection相關         1、介面簡介:                   Collection作為佇列形式儲

Java抽象介面、內部類題庫

一、    選擇題 1. Person類和Test類的程式碼如下所示,則程式碼中的錯誤語句是(  C  )。(選擇一項) public class Person { public String nam

-1-2 java 面向物件基本概念 封裝繼承多型 變數 this super static 靜態變數 匿名物件 值傳遞 初始化過程 程式碼塊 final關鍵字 抽象類 介面 區別 多型 包 訪問許可權 內部類 匿名內部類 == 與 equal

java是純粹的面向物件的語言 也就是萬事萬物皆是物件 程式是物件的集合,他們通過傳送訊息來相互通訊 每個物件都有自己的由其他的物件所構建的儲存,也就是物件可以包含物件 每個物件都有它的型別  也就是類 某一特定型別的所有物件都可以接收相同的訊息,因為同一類事物有共同的特性 面向物件開發 •