2014-04-30 37 views
0

所以我正在這個項目上工作,而且我在如何構造這個問題上遇到了麻煩。基本上,這是我所擁有的:繼承 - 如何構造一個父類與兒童

Main Class instansiates Listener Class。

Listener類偵聽數據包。

當我收到數據包時,Listener類將創建一個Handler類的新實例(它是一個可運行的)。 Handler類然後讀取數據包數據並確定數據包類型(重啓,關機等)並完成它所需要的。

我想要做的,是有一個父類的數據包,然後有子類的所有不同的數據包類型RebootPacket,ShutdownPacket等

我只打算用噸IF語句的處理程序類來創建數據包類的實例(如果packetType =「rebo​​ot」,RebootPacket數據包=新的RebootPacket),但是,我覺得應該有更好的方法來做到這一點。我可以如何使用多態性來做到這一點?任何建議表示讚賞。

+0

林不知道什麼是數據包在你的情況下,但即時通訊猜測你通過網絡發送數據?當對象進入時,最好的方法是使用'instanceof'或者檢查類的類型==你在找什麼 –

+0

@VinceEmigh那麼通過網絡發送的實際數據就是文本,就像一串... – user3180103

+0

爲什麼不使用Object流?看起來好像這就是你想要做的反正。如果你使用阻塞io,ObjectOutputStream可以發送任何實現Serializable的對象。如果不是,那麼是的,您需要檢查字符串值以查看您需要創建的內容 –

回答

0

這是我對你的問題的理解,請糾正我,如果我錯了:

你被送入「包」這是真正的字符串數據。這些數據包可以有多種類型,每種類型的數據包都有不同的動作。每次讀入數據包時,都會創建一個Handler類的新實例,它根據類型完成數據包所需的操作。我將假設包的類型是輸入固有的。

在這種情況下,我會建議使用多態。我會創建一個方法來執行與各種類型的數據包關聯的每個「操作」。每種方法都有相同的方法簽名,只是參數的類型不同。例如:

public void doSomething(RebootPacket p) 

public void doSomething(ShutDownPacket p) 

這可能爲將要使用的每個數據包類型來完成。這可以讓你做的只是撥打doSomething(packet),讓它以正確的方式處理數據包,不管類型如何。

我建議在這種情況下不要使用繼承。當你有一個子類和一個超類時,你希望這個子類擁有與超類相同的所有或大部分方法,再加上超類所不具備的一些方法。在我看來,似乎並不是所有數據包都有共同的方法,而是處理每個數據包的不同方式。如果這是一個正確的假設,那麼多態是最有意義的。如果不是,請評論更多信息。

+0

如何將數據包分配給一個類?如果說明,我是否需要? – user3180103

+0

如果語句是最簡單的方法。但是,如果您首先需要使用大量的if語句,我不明白爲什麼您不能使用相同的if語句來調用正確的方法。 – joepeacock001

+0

嗯,我的意思是,這就是我現在正在做的,很多if語句,然後調用方法,但是我覺得那是非常無組織的,一切都被推到一個類中,等等。 – user3180103