2009-04-09 58 views
3

我對Java很陌生。在閱讀了一些有關路徑搜索的信息之後,我讀了關於使用空類作爲「interface」,以瞭解未知對象類型的信息。這是使用java關鍵字「interface」的正確位置嗎?

我正在開發一個基於醫院主題的Java遊戲。到目前爲止,用戶可以建立一個接待臺和一個GP辦公室。它們是兩種不同類型的對象,一個是Building,另一個是ReceptionDesk。 (在我的類結構)

我的階級結構是這樣的:

GridObject-->Building 
GridObject-->Item-->usableItem-->ReceptionDesk. 

問題是當可用的項目可以旋轉和建築不能。鼠標點擊事件在網格上,因此調用相同的方法。 GP的辦公室是Building,前臺是ReceptionDesk。只有ReceptionDesk的方法rotate。當電網右擊,如果在建設模式,我都用這個「如果」聲明:

if (currentBuilding.getClass.equals(ReceptionDesk.getClass) 

我則必須創建一個新的ReceptionDesk,使用rotate方法,並把該 前臺回到currentBuilding GridObject

我不確定我是否很好地解答了我自己的問題。抱歉。我對Java仍然很陌生。我會盡力回答任何問題,如果需要的話,我可以發佈更多代碼snippits。我不知道可能有辦法解決不了解對象類的問題,但是我也可能會以錯誤的方式解決這個問題。

我沒有計劃在這方面進行調查,直到我看到這個網站上的回覆有多快和有幫助! :)

在此先感謝。

相對

回答

7

你不想在你的情況做有它的東西之前檢查類的一個對象。你應該使用polymorphism。你想讓接口定義一些方法。每個類都實現這些方法。通過接口引用該對象,並讓這些對象的各個實現將其值返回給調用者。

如果您再描述一些您認爲需要的對象,這裏的人們會對您應該如何佈置它們提出意見。但是從您提供的內容來看,您可能需要一個定義一些常規方法的「構建」接口。你也可能想要一個「UsableItem」接口或更通用的東西。醫院可能是一個實施建築的班級。 ReceptionDesk可以實現UsableItem。建築物內部可以有一個UsableItem的網格。

如果rotate()是所有實際做過某些工作的傢俱的常用方法,那麼可以考慮製作一個AbstractUsableItem類,該類是實現UsableItemand並提供rotate()方法的抽象類。如果每個實現類中的rotate都不相同,那麼您可以在界面中使用該方法,但每個類(如ReceptionDesk)都會使用rotate()方法執行自己的操作。您的代碼會做這樣的事情:

UsableItem desk = new ReceptionDesk(); 
desk.rotate() 

在你的榜樣,如果屏幕上的鼠標點擊旋轉的對象下它,你真的需要檢查,看看是否對象可以做這樣的事情之前,旋轉那你會做

if (clickedObject instanceOf UsableItem) { 
    ((UsableItem) clickedObject).rotate(); 
} 

其中UsableItem是接口或抽象類。有些人認爲所有的設計都應該通過界面合同來完成,併爲每一類課程提供一個界面,但是我不知道你是否必須走這麼遠。

+0

感謝這個有用的答案和信息。在我完全理解它之前,我將不得不更多地閱讀它,雖然從你將它鏈接到的例子來看,這看起來像我應該在這裏做的事情的正確方式。 – Relequestual 2009-04-10 16:30:27

+0

我已閱讀更多內容,請閱讀您提供的鏈接以及該網站上的鏈接。良好的資源。這是我以前的答案,雖然它確實假設我明白抽象和接口是什麼,我沒有,但我想這是一個公平的假設。 – Relequestual 2009-04-11 16:02:56

3

您可能會考慮朝完全不同的方向前進,並讓對象自己決定採取何種行動。例如,GridObject接口可以爲handleRightClick(),handleLeftClick()等指定函數聲明。在這種情況下你會說的是「任何自稱爲GridObject的類需要指定右鍵單擊時發生的事情」。

所以,在Building類中,你可能會實現handleRightClick什麼都不做(或者返回一個錯誤)。在ReceptionDesk類中,您可以實現handleRightClick旋轉桌面。然後

您的代碼段會成爲:

currentBuilding.handleRightClick(... any necessary parameters ...); 
+0

這看起來像我正在尋找的東西!卓見!我相信約翰的回答非常好,但它可能只是在我頭上。 我將不得不在GridObject類中具有相同的方法,並使其爲空,同時讓其他類中的方法名稱相同。 – Relequestual 2009-04-10 10:05:08

1

你是正確的擔心不無道理。面向對象設計的一個好的經驗法則是,無論何時使用像if(x instanceof Y)if(x.getClass().equals(Y.class))這樣的結構,您都應該開始考慮向上或向下移動方法或提取新方法。

艾略特和約翰都在不同的方向上提出了很好的想法,你可以去,但他們都是對的,你應該肯定會朝某個方向前進。面向對象的設計可以幫助你的代碼變得更清晰,通過爲不同類型的行爲分支更隱含。檢查你在看什麼類型的對象,並根據它來決定要做什麼,可能會破壞使用面向對象設計的目的。

我也應該警告你,一個接口不完全是一個空類。空抽象類與抽象方法和接口之間存在一些顯着差異。不要將接口看作空的類,可以將接口看作是一個契約。通過實現一個接口,你的類承諾提供界面中列出的每一種方法。