2014-01-10 43 views
1

我正在開發一款遊戲。我有一個職業武器和Shotgun,, ... 現在我想有特殊的武器,如AK47 30子彈彈藥10點傷害等 同樣的事情是與類車。例如,蘭博基尼的固定最高時速爲300公里/小時,而Seat leon的固定最高速度爲200,但仍然是一輛汽車(或其子類?)。 我應該怎麼做?蘭博基尼是在構造函數中具有固定值的汽車的一個子類嗎?我應該在汽車級別或文件中使用每個車輛的常量值嗎? 希望我清楚。 謝謝固定值的對象

編輯: 我覺得我不夠清楚。我需要「保存」車輛的默認值(蘭博基尼:max peed 300 ...),以便在遊戲中玩家可以擁有蘭博基尼,並且始終最高速度爲300.與子類別的選項現在因爲蘭博基尼只是一個汽車的例子。所以現在我的問題:在文件中或作爲類車的靜態常量? 例如:

public class car { 
    public static final int SPEED_LAMBORGHINI = 300 

    // rest of class car 
} 

我認爲文件將是更好的設計,但並沒有把它帶到龍加載從文件中每一個需要的武器是什麼?

+0

這完全取決於你在哪裏存儲這些值如果您確定這些值永遠不會改變,你可以用硬編碼值去要不要去我不認爲從文件中讀取一些值需要很長時間 – user1455836

+0

我已經看到這個問題有點基於觀點,但是如果我們把所有的答案放在一起,我們對未來有很好的答案。我不能回答我自己的問題,因爲我是新的,而且我不能在當時贊成,但是如果有人想做一個總結,我會將它標記爲正確的答案 – Springrbua

回答

-1

我已經看到,這個問題的答案取決於自己的意見和遊戲的設計。沒有答案是真的正確的答案,所以我決定寫一個總結:

  • 如果你的物體(車輛,武器等)具有相同的功能和領域沒有必要爲一個子類。
  • 爲了保護您的固定值,您可以將它們寫入外部文件並在需要時讀取它們。
  • 您也可以將它們作爲最終常量或作爲枚舉存儲在您的源代碼中。
  • 你也可以有一個汽車的構造函數或任何你需要的int類型的參數。根據這種類型,你可以爲你的對象使用正確的常量。
  • 如果您需要許多具有相同類型和值的對象,還可以實現複製方法並在啓動時加載所有不同的類型(但要考慮它們所用的內存),然後在需要時複製它們。

希望這可以幫助你,感謝你的答案(:。

+0

你能解釋爲什麼你低估了答案嗎?我不在乎投票,但是如果你告訴我爲什麼我可以改進答案。 – Springrbua

0

有一個抽象類Car,它稱之爲自己的抽象方法getTopSpeed(),它被覆蓋並由子類LamborghiniSeat Leon實現。

這意味着您可以從任何方法或集合中獲得Car,並且無需知道它是什麼類型的汽車即可獲得最高速度。它被稱爲多態性。

+0

因此,子類在getTopSpeed中有固定值( )? – Springrbua

+1

我不認爲這是個好主意。例如,你會爲小組中的每個學生創建子類嗎?這裏同樣的情況。 – user1455836

+0

不,這不是因爲每個學生都有相同的屬性和動作,所以他們會使用一個班級。 'Student'可能是一個子類,比如'Person' –

1

每種車型可以簡單地是類別Car的實例,其中諸如carName,topSpeed等的字段可針對每種特定類型設置。從概念上講,蘭博基尼或其他車型與其他車型沒有太大差別,所以對於不同的車型來說,並不是真的有必要成爲Car的小類。您可以從Car構造函數和/或setter方法(例如setTopSpeed()setName()或其他)設置不同的字段。

5

一般一個蘭博基尼將是一個與Car類型String與值「蘭博基尼」一個name字段和int類型和值300maxSpeed字段。

我想其餘的變得明顯。

本質上 - 爲不同的對象使用不同的類別Form。你很少需要每個對象具有不同的類。

一個德羅寧將是一個Car但時間旅行德羅寧可能是不同的類。

但是 - 因爲enum s爲現已您不妨考慮:

enum Car { 
    Lamborghini(300), 
    Seat(200); 

    final int topSpeed; 

    private Car(int topSpeed) { 
     this.topSpeed = topSpeed; 
    } 
} 

新增

至於你在哪裏存儲格蘭信息查詢 - 我把默認的代碼但允許每個對象從一個屬性文件中修改該值。一個enum這裏幫了不少忙,你可以把這樣的:

TopSpeed.Lamborghini=286 

在你的屬性文件並獲得enum,自動將調整。

新增

記住enum s的意思是接近常量,就可以實現。不要試圖擴展它們或改變它們的屬性(除了在開始時可能只有一次)。

要使用此表,您需要類似:

class Player { 
    Car vehicle = Lamborghini; 
    ... 
+0

@RossDrew - 然後你將'Car'的'Headlights'分解成一個新的'class',並讓每個車型選擇它自己的'Headlight'類型。 – OldCurmudgeon

+0

意外刪除我的評論:/。所以是的,爲了增加一輛帶有特殊大燈的汽車,你需要修改汽車。違反開放原則。 –

+0

@RossDrew - 請解釋一下這個「開放 - 封閉」原則。我不明白這種設計比其他設計更不穩定。所有的設計都很脆弱,以至於某種形式的變化。 – OldCurmudgeon

1

在我的遊戲我用它定義的具體對象的屬性XML「配置文件」。 這對我很有用,因爲它允許設計出來的遊戲,誰是不同的人,無需直接處理代碼即可輕鬆更改這些值。另外,很容易添加新型武器/汽車/ ...而無需編程任何東西。

但是你的方法也可以。這或多或少是常識和味道的問題。

+0

這正是我需要的,因爲我想稍後添加新的武器。也是新的武器類型,但是這是子類。所以現在的問題是:Constantsin類或文件。是不是很麻煩當你需要新的武器/汽車時總是加載文件? 你有每個車/武器的文件或所有的文件? – Springrbua

+0

我有他們在不同的文件。您可以創建一次加載所有配置文件的工廠,然後您可以通過配置文件名稱實例化您需要的一種武器類型。 –

+0

因此,如果我以我的角色開始我的遊戲持有AK47,我只需加載AK47.xml(或其他)並從此信息中創建一個武器實例? – Springrbua

3

你應該與什麼是類和什麼區別是實例

一個藍寶堅尼例如是類仍,但它是一個特例。 類別本身應包含關於任何實例(即Car具有NAME和TOPSPEED)的結構的信息。

然後,在創建實例時,應該指定那些定義的屬性。

Car Lamorgini = new Car("Lamborgini", 300); 
Car Seat = new Car("Seat", 200); 

這也將使得保存所有實例的信息出你的「代碼」,以方便實施新carinstances,無需重建應用程序。

+0

The Thing is我會反覆使用相同的值。當我使用你的模板時,我可以定義蘭博基尼擁有200個最高速度等等。所以我需要確保cartypes的默認值。 – Springrbua

+0

@ user3182091這是如何工作的。 OFC。在實踐中,您會爲汽車定義一個「id」並根據id加載所有值(從而分開MODEL和DATA)。說「保時捷911」是你的ID,你的數據集保存有關馬力,車輪,顏色等信息) - 使用加載你的車的方法將插入所有信息。 ('CarService-> loadCar(「保時捷911 Turbo」)' – dognose

+0

@ user3182091顯然,您可以使用CarModel類來保存品牌,最高速度等等和Car類以保存顏色和其他實例特定的屬性。 – user1455836

0

「蘭博基尼是汽車的一個子類,在構造函數中有固定值嗎?」

可能。或者只是一輛汽車,它具有在構造函數中設置的值,並且不會重置。或者也許只是一輛具有初始價值的汽車;例如,損壞可能會降低最大值。取決於你的程序的需求,以及你將如何/是否將這個類暴露給操作和重用。

「我應該在汽車級別或文件中的每輛車的價值常數?」

其中之一,當然。

1

除非不同的汽車和武器具有不同的功能,否則我認爲最好堅持類CarWeapon

只是有一個像weaponTypeweaponName區分不同的武器。

+0

除您需要要區分不同的武器,那麼他們可能應該去不同的職業 – user1455836

+0

Yea武器有像霰彈槍和狙擊手這樣的子類,但是這個子類有一個像AWM這樣的特殊實例狙擊手永遠是同一個AWM狙擊手。 .. – Springrbua

1

這實際上不是一個容易回答的問題,因爲這是一個沒有明確正確答案的設計決定,但我會盡我所能提供幫助。

然而,你最終設計你的代碼,它必須是一致的,所以這將是一個很好的方法來規定什麼時候子類和何時不要。對此的一個很好的規則是僅當行爲改變時才進行子類化。

在您的例子,如果一輛蘭博基尼和一輛豐田之間的唯一區別是它的速度,顏色和名稱,您Car -class已經有場speedcolorname沒有理由,爲蘭博基尼和豐田的子類。

例如坦克是Car的典型子類,因爲它確實有名稱,速度和顏色但行爲完全不同,很可能需要一組與拍攝無關的新方法,並且可能會行爲有所不同(例如,Car在調用accident(Car other)方法時會被銷燬,坦克仍然會實現此方法但行爲不同)。

所以試着想一下,如果你的子類實際上有不同於其父類的行爲,以確定它是否值得自己的類。