2009-05-17 25 views
2

我有兩個類A和B,其中B是A的子類,A不是抽象的。因此,我可以擁有A實例的對象和B實例(因此A)的實例。Java對象的最具體的子類?

我怎樣才能區分是A的唯一實例對象?

當然,我可以寫類似「對象instaceof一個& &!(B的對象實例)」,但是這是一個非常糟糕的設計,因爲我需要每次更改代碼,我添加新的子類A.更好的選擇?

回答

7
object.getClass() == A.class 
2

沒有這表明B是不是一個真正的阿? 我不完全確定你應該進入這種情況?也許你可以改進你的設計?

5

爲什麼你想他們區別?通常這與面向對象相反。你有不同的實例,你不需要區分,因爲不同的實現將一切正確。

如果你需要的話不是應該有它的協議。爲此目的有一個方法返回要識別的東西。這也更靈活。

我會}這種和的getClass已經考慮不良作風,如果這是在沒有很好的理由

+0

+1與你的答案。 Java是一種靜態語言,如果您必須考慮您的對象的動態類型,請查看訪問者模式。 – pgras 2009-05-18 09:11:13

+0

這很像OO方式解決Dispatcher模式的情況。該模式啓用依賴於對象類型的不同行爲,但我不確定在Java中是否可行。恕我直言語言需要更好的支持元編程... – 2010-04-03 10:16:57

2

一個更好的方法是使測試方法的結果

class A { 
    public boolean isSomeTest() { 
     return true; 
    } 
} 
class B extends A { 
    public boolean isSomeTest() { 
     return false; 
    } 
} 

然後,如果你添加一個C使用它擴展了A,你可以允許它返回true或false。

isSomeTest的名稱應該清楚什麼返回true或false應該的意思。

2

這是我認爲你說:

public class A { 
} 

public class B extends A { 
} 

在後面的代碼:

A apple = new A(); 
B banana = new B(); 

以下是一些您可能會發現一些有用的選項:關於

if (apple.getClass() == A.class) { // Found an A } 
if (banana.getClass() == A.class) { // This is not an A, won't get here. } 
if (apple instanceof A) { // This is definitely an A } 
if ((apple instanceof A) && (!(apple instanceof B))) { // It's an A but not a B } 

最後一個選項,你寫了以下內容:

當然,我可以寫類似 「對象instaceof一個& &!(B的對象 實例)」,但是這是一個非常 設計很差,因爲我需要我每次添加新的時間來改變 代碼 的子類更好的替代品?

多態性幾乎總是可以幫助我們在這裏。每次添加子類時關於更改代碼的觀點正是您應該認識到的標準面向對象設計演變的一種症狀。想想你想要製造的行爲。你能否將它推入課程本身,而不是委託給外部供應商,因爲它需要推導出目前正在使用的課程?

沒有更多的信息,我不能透露太多指導,但這裏有一個很簡單的例子:在

public class A { 
    public void executeCommand() { 
     // run class A code 
     // This method knows that it's definitely an A, not a B 
    } 
} 

public class B extends A { 
    public void executeCommand() { 
     // run class B code 
     // This method knows that it's a B (and, therefore, an A as well). 
    } 
} 

其中後:

// Instead of this 
if (apple.isClassA()) { // run class A code 
} else if (apple.isClassB()) { // run class B code 
// And so forth 
} 

修改設計變得更加喜歡這個執行代碼,您替換您以前的if test用:

apple.executeCommand(); 
banana.executeCommand(); 

Ad毫不奇怪,這是一個幾乎無關緊要的面向對象設計審查,但它可能會動搖一些鬆散的東西,並幫助你處理你的子類問題。

0

使用對類屬性的對象的getClass方法:

if(someObject.getClass() == A.class){ 
    //some code 
} 
相關問題