2016-03-01 54 views
2

我有一個抽象類'TopHandler'。有兩個類擴展了TopHandler:'UserHandler'和'MerchantHandler'。Java抽象類 - 我該如何最好地解決這個問題?

我有一個方法sendMessage(),我不確定在哪裏放置。一種選擇是將其放在TopHandler並創建要麼UserHandler或MerchantHandler的對象,像這樣:

public abstract class TopHandler { 

    //Other methods... 

    public void sendMessage() { 

     TopHandler handler; 
     if (message.equalsIgnoreCase("User")) { 
      handler = new UserHandler(); 
      //Call UserHandler implementation of abstract methods 
     } else { 
      handler = new MerchantHandler(); 
      //Call MerchantHandler implementation of abstract methods 
     } 
    } 
} 

我的另一種選擇是讓的sendMessage()抽象的,有兩類實現它,但是這確實創造了一些重複/非常類似的代碼。

+0

IMO你的結構足夠好...也許你想檢查[FactoryPattern](http://www.tutorialspoint.com/design_pattern/factory_pattern.htm) –

+1

取決於兩個子類是否都需要它,以及它是如何需要。它是靜態的嗎?取決於實例?取決於類型? – Stultuske

+2

我發現奇怪的是'TopHandler#sendMessage()'不是靜態的,而是用於實例化一個'TopHandler'。但我沒有完整的代碼視圖。無論如何,另一種解決方案可能是有一個抽象的'TopHandler#createHandler()'方法,它將爲每個子類返回正確的處理程序 – jhamon

回答

0

我個人認爲,一個班級不應該知道它的子類。

如果您創建另一個繼承自TopHandler的類,會發生什麼情況? 您需要更改TopHandler類的行爲,而不是簡單地重寫子類中的方法。

你可以找到其他的意見here on programmers stackexchange

要回答你的問題,解決方法很簡單:在此改變在每個子類中的方法。如果有重複,請嘗試重構您的課程,以將其中的大部分課程移至TopHandler課程中。

這可能是這樣的:

public abstract class TopHandler { 

    //Other methods... 

    public void sendMessage() { 
     TopHandler handler = createHandler(); 
     //Call Handler implementation of abstract methods 
    } 

    public abstract TopHandler createHandler(); 
} 

PS:作爲一個非靜態方法,它覺得不可思議的是sendMessage實例化一個新的TopHandler。你可能在這裏有點問題。也許你只需要使用this而不是新的處理程序(但很難說,因爲我們沒有完整的代碼)。

2

我會調用一個明確的工廠方法來明確這是它在做什麼。

static TcpHandler create(String mode) { 
    return mode.equalsIgnoreCase("user") ? new UserHandler() : new MerchantHandler(); 
} 

然後,您可以在您的實例代碼中調用此方法。

0

我建議堅持戰略設計模式,並在TopHandler abstract,中聲明sendMessage()。然後在UserHandler和MerchantHandler類中實現該方法。

原因是:假設這段代碼必須被擴展,然後可以簡單地添加另一個擴展TopHandler的類並實現所有繼承的方法並測試新的類。如果必須更改原始的TopHandler類,那麼該類也必須進行測試。

此方法在每個子類中實現時,可讀性也更好。

0

你應該讓sendMessage()抽象並在兩個類中實現它們。並嘗試將重複代碼移到TopHandler類中的單獨方法中。

因爲不知道父類中的子類是不是很好。父類應該只包含可用於每個子類的通用代碼。

你可以看到抽象類here

0

由於sendMessage()TopHandler定義,也不是一成不變的,我認爲當你調用它,你已經有了一個具體的實現(無論是UserHandlerMerchantHandler實例)來調用它。

首先,在這種情況下,不要在sendMessage()中創建更多實例。

保持sendMessage()TopHandler和非抽象,併爲您在sendMessage()使用每一個具體實現的方法TopHandler抽象方法。這樣,常見的實現將保存在TopHandler中,避免代碼重複,只有細節將在子類中實現。


另外,如果你的目的是爲sendMessage()是靜態的 - 在這種情況下:

  • 使其成爲抽象不是一個選項
  • 第一部分基本上是一個工廠模式(和可能爲了清晰起見,將它們分成它自己的方法)
  • 實際發送應該只完成一次(不是在每個條件的分支中)並且使用(可能是抽象的)方法TopHandler
0

if/else檢查類型的代碼告訴你,你做錯了。這就是繼承和多態性誕生消除。

如果Handler子類需要在sendMessage()中做一些不同的事情,那麼抽象類需要提供一個合理的默認值或使該方法爲抽象。

工廠/虛擬構造函數的建議是現貨。

相關問題