2017-07-29 48 views
-1

我不得不象下面我應該使用抽象類還是使用類?

時更改
interace A { 

} 

class B implements A { 
} 

現在,我發現我不得不重複一段代碼提取出到的方法的情形。

說有B類像下面的方法:現在

private void domSomething() { 
//sequence of steps 
} 

,問題是,在未來,我們期待一個接口等實現使用方法doSomething()

所以這裏的困境是應該將方法doSomething()移動到util類,或者我們應該創建一個受保護的doSomething()方法的抽象類。像下面的東西。

abstract class C implements A { 
protected void doSomething(); 
} 

class B extends C { 

} 

或者創建一個utils的類,並令B仍然實現A.

一般來說,我喜歡用抽象的剋制,並尋找途徑,以避免它們。因此,這導致在這裏的一些問題:

  1. 是正確的方式來思考抽象類?
  2. 這裏應該更偏愛哪種方法,爲什麼?
  3. 總是歡迎任何其他暗示思考過程的暗示。
+0

,如果我得到你的問題的權利, 你應該寫you' DoSomething的()'方法到一個類,並回答你的問題是沒有是不正確的方式去思考抽象類,如果你想要改變一個類來抽象和實現'doSomething()'函數,那麼如果其中一個子類沒有實現這個函數,那麼這個函數被調用你的代碼運行父功能,回答你的第二個問題,我應該說移動功能到一個類。 – Rome

回答

0

private void domSomething()沒有返回值,這意味着方法更新一些狀態,也可以是全局狀態(數據庫或外部資源),也可以是類這種方法存在的內部狀態。

如果方法更新基於類的內部部件的全局狀態,那麼它應該被移動到另一個類和所有必需的數據傳遞作爲參數

public class Util 
{ 
    public void DoSomething(value1, value2) {} 
} 

如果方法更新類的內部狀態,那麼它可以被放置到抽象類,因此,所有派生類可以訪問它。

public abstract class A 
{ 
    protected void DoSomething() {} 
} 

如果您想讓派生類可以改變它的行爲,使方法爲virtual/overridable。

0

當你模擬類中的一些層次結構,將常見的邏輯家長使用抽象類,更在嘗試喜歡組成了繼承

而使用靜態UTIL /輔助類時,邏輯很通用的,可以使用多個類,例如FileUtils.createTmpFile

+0

使用靜態方法是應該避免在第一個地方!在OOP中沒有這種設計的地方。 –

1

我會preffer去「util類」(但不是靜態!只是另一個類定義一個共同的行爲)。換句話說,preffer「構成超越繼承」。

更多信息爲什麼在這裏:

Prefer composition over inheritance?

+0

如果'doSomething'使用utill類更新'C'類 – Fabio

+0

的某些私有成員,那麼util類將不起作用,那麼將不會有抽象類C –

相關問題