2013-09-26 30 views
2

在我努力理解Java/C#中的接口時會問這個問題。正如我的程序員朋友告訴我的,界面是理解最簡單的概念之一,但很難有效使用。任何人都希望downvote,請考慮引導我在正確的方向前downvoting(我不介意,只要我得到我所尋求的知識)。瞭解Java/C中的抽象和接口#

我明白界面是如何工作的,但對我來說這似乎有點模糊。

考慮一下:

public interface Drawable { 
public void draw(Graphics g); 
} 


public class Line implements Drawable { 
public void draw(Graphics g) { 
. . . // do something---presumably, draw a line 
} 
. . . // other methods and variables 
} 

現在,做一些與此我還要做:

Drawable newObject= new line(); 

我有一個抽拉型,但我仍然需要創建該類的新對象,線。這就是說,糾正我,如果我錯了,我仍然在創造一個類,線的對象意味着;如果上述內容是爲了內存優化而完成的(我知道它與抽象內存相關的內容比較多),那麼編寫上面的代碼並不能幫助我節省內存。

我的問題是:如果類行具有在它實現的接口上指定的方法,爲什麼我不能只執行以下操作?

public class Line { 
    public void draw(Graphics g) { 
    . . . // do something---presumably, draw a line 
    } 
    . . . // other methods and variables 
    } 


line newObject= new line(); 

畢竟,除了創建一個基類型之外,接口不做任何事情。我的新手的理解是:第二個將不需要接口,並減少代碼。

我可以採取同樣的方法,併爲抽象類說同樣的事情,因爲你仍然必須提供具有重寫方法的具體子類。我的問題就是,爲什麼不在不需要抽象類的情況下聲明和創建具體對象。

我相信我在這裏錯過了一些東西。什麼使界面如此有用?對於我來說,只是在實際的事情由實際的課程完成時才添加更多的代碼。任何人都可以照顧解釋嗎?

+0

您是否閱讀過[接口上的Java教程](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html),整個「界面定義合同」的東西?這對你沒有用處? – Joni

+0

我親愛的Joni(很高興見到你的評論)。是的我有,但仍然逃避我。 –

+0

[Interface vs Base class]的可能重複(http://stackoverflow.com/questions/56867/interface-vs-base-class) –

回答

8

寫上面的代碼並沒有幫助我節省任何內存,如果上面的東西是對內存做了優化

良好的編程實踐中很少有與表演有關的任何事情。在這種情況下,你是對的。

畢竟,接口除了創建基類型之外別無他法。我的新手的理解是:第二個將不需要接口,並減少代碼。

你說得對。現在考慮你有其他的Drawable,而不僅僅是一行。

canvas.draw(new Line()); 
canvas.draw(new Square()); 
canvas.draw(new Circle()); 

並且您希望開發人員能夠添加自己的形狀。你不能爲他們創建一個繪製方法。你想要的是像

class Canvas { 
    public void draw(Drawable drawable) { /* ... */ } 
} 

是什麼讓接口,這樣有用嗎?

https://www.google.com/search?q=What+makes+interface+so+useful獲得1.38億次點擊。

很難想象我可以說什麼,之前沒有這麼多次說過。 ;)

+0

這給了我正是我想知道的。非常感謝! –

2

接口是一個方法,通過這幾款(也許是完全不同的)類可以表明他們有共同的東西,可以傳遞給那些不關心其他領域的激進分歧某些方法,只是他們是與其他類似。

我自己的代碼中的一個例子;

public interface ToolAffected { 

    public void toolUsedOnMe(Tool tool, PickingResult pickingResult,Mob toolUser); 
    public void toolUsedOnMe(BlockTool tool, PickingResult pickingResult,Mob toolUser); 
    //use polymorphism for more detailed blocks 
} 

所以,如果我有一個特定的工具,那麼我可以在任何實現ToolAffected的任何東西上使用它。這可能是環境的一部分,玩家,任何事情。在這種情況下,我從他們的圖形中選取了ToolAffects(超出了這個問題的範圍),但重要的一點是,將ToolAffected連接到圖形的所有代碼,使用它的工具甚至不關心什麼實際上,只有它有這兩種方法。

我使用這樣的

 ToolAffected pickingResult=picker.picked(cam.getLocation(),cam.getDirection()); 
     target.toolUsedOnMe((BlockTool)inventory.getSelectedTool(), pickingResult, this); 
0

在java中

接口看作出路涉及多重繼承(因爲它不支持Java)的複雜性。這加上它也可以用作多態引用。

0

比方說,你有一定的幾何形狀像方形,圓形。他們都可以在紙上有一個代表。假設你有一個知道如何繪製形狀的課程(藝術家?)。你會怎麼做?爲每種形狀編寫方法?事實上,你將會得到更多的代碼。

相反,您可以在您的藝術家課程中使用類似public void draw(Drawable obj) { obj.draw(); }的方法。您現在需要的只是爲您的Square,Circle和其他Shape類實現Drawable。

您可能會說:我會將繪畫添加到Shape類,並且藝術家將收到一個Shape。這是錯誤的,也許我的例子不是很好挑選,但我們假設一些你不能畫的形狀。所以功能必須在Drawable界面中進行。

0
  1. 您可以實現多個接口。但是你只能擴展一個類。
  2. 其更抽象。你可以定義你可以用一個對象來做什麼,比如Comparable Movable Closable等等。這些類不必在同一個層次結構中