2014-01-14 219 views
0

我有一個超類,比方說BaseClass的和兩個子類,比方說SubclassASubclassB,他們沒有他們,但他們的父類之間的任何其他關係。兒童法

在有很多在我的代碼,我需要調用兩個子類,有方法,但不是父類的地方......我發現自己重複了很多代碼看起來像:

if (obj instanceof SubclassA) { 
// stuff 
} else if (obj instanceof SubclassB) { 
// same stuff 
} 

第一個想法應該是將這些「東西」放入超類的方法中,但是我不能將超類作爲沒有這種行爲的其他子類的父類...

所以...那裏一種避免重複所有代碼的方法?

也許兩個子類的公共超類都是超類的子類本身?

+0

這段代碼是在SuperClass中?超類無法知道子類 –

回答

1

首先,多態性的概念是取消在調用對象之前檢查對象的類型的需要。所以,這在OO語言中不應該是必需的。其次,爲什麼你可能在接口上使用抽象父類的原因不過是因爲子類型(子類)之間有一些共享功能。因此,如果SubclassASubclassB之間存在共享的通用功能,請保持您的超類完好無損,否則將其切換到接口。

同樣,正如你建議你自己,如果SubclassASubclassB有一個共同的行爲(但自己的實現),然後利用一個單獨的API(如果其他的子類型BaseClass不還共享行爲(您#doStuff調用) 。

在這種情況下,我會介紹接口包含方法#doStuffStuff,並有我的兩個SubclassASubclassB實現它,每個提供它自己的實現。然後,您的客戶可以把你obj實例作爲Stuff,不管它是真實的類型和多態將會完成剩下的工作

interface Stuff { 
    void doStuff(); 
} 

public class SubclassA extends BaseClass implements Stuff { 
    // Does it need BaseClass still? 
    public doStuff() { 
     ... 
    } 
} 

public class SubclassB extends BaseClass implements Stuff { 
    // Does it need BaseClass still? 
    public doStuff() { 
     ... 
    } 
} 

// Example client code... 
public class MyStuffClient { 

    Stuff s = new SubclassA(); 
    ... 
    public void onStuff() { 
     s.doStuff(); 
    } 
} 

決定您是否真的需要suer類BaseClass

5

我會建議在父級抽取方法作爲抽象方法(如果父級是抽象的),或者只是將在子類中重寫的方法。如果這是不可能的或者可取的,我會建議添加一個通用的抽象類,它擴展了只有兩個子類共有的方法的父類,然後再由兩個子類進行擴展。

如果添加和更改父類可能是一個問題,您可以使用一個接口,然後由兩個子類實現,您需要調用您的代碼,您將只投到給定的接口和調用所需的方法。

事情是這樣的:

interface CommonInterface { 
    void commonMethod(); 
} 

class SubClassB implements CommonInterface { 
    void commonMethod() { 
     // implementation 
    } 
} 

class SubClassA implements CommonInterface { 
    void commonMethod() { 
     // implementation 
    } 
} 

//... 
if (obj instanceof CommonInterface) { 
    ((CommonInterface)object).stuffCall(); 
} 
2

的方法添加到超類。
使它與一個空的身體。

在SubClassA中覆蓋它,實現你需要的邏輯。
在SubClassB中覆蓋它,實現你需要的邏輯。

然後在你的調用代碼,而不是做

if (obj instanceof SubclassA) { 
    obj.method(); 
} else if (obj instanceof SubclassB) { 
    obj.method(); 
} 

只是這樣做

obj.method(); 

提供obj被聲明爲父類的一個實例。

在超類中的空方法體,保證你有
沒有任何問題與此「但我不能作爲父類是父母
到不具有行爲的其他子類」

這樣的想法是,你將有空行爲
在超類和所有子類,其
不明確重寫此方法。

1

什麼有以下兩種方式:

  1. 聲明超類中的目標方法,並提供一個默認的實現(例如空方法,什麼也不做。)爲好。如果需要,子類將覆蓋該行爲。
  2. 在Interface中聲明目標方法,並使接口的SubclassA和SubclassB實現。超類和其他子類不需要實現接口。
1

如果SubClassA和SubClassB有一些不存在於子類C,D,E等中的行爲,那麼只需在父類和A和B之間引入一箇中間類。C,D等從父類派生,B派生來自包含A和B共享功能的新類。

0

您可以在超類protected上生成該方法。例如,你可以在父類做到這一點:

package test; 
public SuperClass { 
    protected void myMethod() { 
     ...stuff... 
    } 
} 

上的曝光SubclassA

package test; 
public SubclassA extends SuperClass { 
    public void myMethod() { 
     super.myMethod(); 
    } 
} 

和隱藏在SubclassB(只是沒有覆蓋它)

package test; 
public SubclassB extends SuperClass { 
} 

從不同的包裝,除非類改變它的可見性修飾符,否則保護方法是不可見的。

來源:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html