我是asp.net程序員。我已經閱讀了抽象類和接口的文章,我也知道如何實現它。但是任何人都可以實際地解釋我,即通過引用項目場景,在哪裏使用抽象類以及在哪裏使用接口?何處使用Abstact類以及在哪裏使用接口?
我需要一個非常實用或真實世界的項目示例,以便我可以非常有效地在我的項目中實現它?
謝謝先進。
我是asp.net程序員。我已經閱讀了抽象類和接口的文章,我也知道如何實現它。但是任何人都可以實際地解釋我,即通過引用項目場景,在哪裏使用抽象類以及在哪裏使用接口?何處使用Abstact類以及在哪裏使用接口?
我需要一個非常實用或真實世界的項目示例,以便我可以非常有效地在我的項目中實現它?
謝謝先進。
我不能給你一個實際的例子通俗易懂,但讓我解釋一下這兩個事物之間的根本區別與小例子:
的抽象類是類層次結構的一部分。這意味着它們被用於繼承。接口與繼承無關。抽象類意味着你不能實例化它,並且所有成員(字段,方法和構造函數)都由子類繼承。一個接口只能定義方法來實現。
一個vehicle
可以是一個抽象類car
和boat
,如果你只是想真實的汽車和船隻被實例化:
,你有一個分層結構,這是有道理的,您應該使用抽象類。車輛可以有一個maximumSpeed
字段,然後繼承。一個接口不能定義這個字段。
你應該當你只需要這些方法時使用一個接口。假設您正在編寫一個與這些車輛(「驅動它們」)交互的程序,但並不關心這些對象的狀態,您可以使用方法drive()
定義接口vehicle
,以便程序可以驅動所有船隻和汽車,而不知道它們究竟是什麼。
最後,一個類可以實現多個接口。另一個顯示差異的例子是,如果你可以在現實生活中描繪你的物體,那麼你就會考慮如何與它進行交互。假設一個咖啡機,它有一個開/關按鈕。一臺「抽象咖啡機」實際上並不合理。所有你需要知道的是有一個setOn()
和setOff()
方法。
談論咖啡機:http://www.objectmentor.com/resources/articles/CoffeeMaker.pdf –
不錯的閱讀初學程序員:) – MarioDS
我個人喜歡使用接口,當我必須定義對象的特性或能力時,無論對象是什麼。
在一個「真實生活」的例子中,有2個類,Person和Mones(我的暱稱:D)和1個接口,IGuitarPlayer。因此,Mones繼承自Person,如果Mones能夠彈奏吉他,它將實現IGuitarPlayer接口。
由於項目中的例子取決於您首先必須瞭解的範例才能理解的範疇,因此我會以烹飪爲例對其進行抽象。
假設我們希望能夠用不同的調味汁烹製意大利麪:我們希望在我們的源代碼中獨立處理意大利麪。第一種方法可能是定義一個接口IPasta與方法庫克:從它的實施
public interface IPasta
{
void Cook();
}
我們的客戶代碼,然後可以煮麪條獨立:番茄醬,香蒜醬?你的名字,我們可以煮:
...
IPasta pasta = GetPasta();
pasta.Cook();
...
更仔細地思考這個問題,但是,我們發現,烹調麪食總是相同的過程,但不包括在這裏我們要準備醬料點。
這意味着我們有一個基本的意大利麪算法,我們可以獨立於任何調味汁實現:煮沸水,準備醬汁,將意大利麪從鍋中取出並與醬汁合併。
public abstract class Pasta
{
public void Cook()
{
BoilWater();
PrepareSauce();
...
}
protected abstract void PrepareSauce();
private void BoilWater()
{
// Boil some water
}
}
public class PastaWithPestoSauce
{
protected override void PrepareSauce()
{
// Prepare pesto sauce
}
}
,我們的客戶會使用這樣的:
...
Pasta pasta = GetPasta();
pasta.Cook();
...
所以我們還是有一個接口,而不是在C#中的意義,但在衆所周知的公益行爲的一般意義(public方法庫克抽象類),但我們也設法省去了一些代碼。
可能的重複[何時使用接口而不是抽象類,反之亦然?](http://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an - 抽象類,反之亦然) –