2016-06-07 46 views
1

如果我有一個複雜的繼承層次,我想做一個平等檢查,取決於具體的平等有沒有一種方法來確保我運行使用該平等檢查,而不是一個可能表現不同的孩子類重寫的版本,然後我想要?運行等同的方法由父類從外部類定義

舉個例子可以說我有與它自己的平等類FOO,然後我有一些像用噓聲等於類有點像下面sudocode(懶得去糾正它全稱)

class Foo { 

    int id; 
    int otherId; 
    int count; 

    public boolean equals(Object other){ 

    //check other instance of foo and re-cast 

    return (id==other.id && otherId==other.otherId) 
    } 
} 

class Bar extends Foo{ 

    private someObject uniqueValue; 

    public boolean equals(Object other){ 

     //check other instance of foo and re-cast 

     return super.equals(other) && other.getUniqueValue.equals(this.getUniqueValue); 
    { 
} 

然後我有一些方法,這需要其引用相同的foo和添加了計數他們

public combineFoos(Foo foo1, Foo foo2){ 

     if(! foo1.equals(foo2)) 
      throw IllegalArgumentException("no match"); 

     Foo combinedFoo=new Foo(foo1.id, foo1.otherId, (foo1.count + foo2.count)) 

     return combinedFoo 
    } 
} 

理論上,這所有的作品太富的對象,直到酒吧價值的用武之地。現在,如果我叫combineFoo並通過一個酒吧foo1它失敗,因爲酒吧等於方法車cks foo2是一個instanceOf欄。我真的不在乎foo2是否是酒吧,我需要的信息可以用於任何foo。對於這個問題,如果我傳遞了兩個不相等的條,這兩個條都等於foo的平等方法定義的條件(即只有uniqueValue字段不同),我希望combineFoo仍然接受它們作爲相等的Foo,即使Bar不等於Bar的定義。

問題是我想對FOO認爲的平等性進行平等檢查,但我不知道我實際可能會收到哪些奇怪的繼承類。有沒有辦法解決這個問題,基本上在我的combineFoo中說,總是使用FOOs的equals定義,即使它被一個子類覆蓋了嗎?

相關,這是一個更糟糕的想法,那麼我認爲它是即使可行,還是有一些其他方式來處理像上面的例子,有效地重新寫在foo的combineFoo內平等的方法嗎?

+0

'Equals'不是'equals'。使用正確的方法。 – MikeCAT

+0

你的代碼有很多錯別字,它不能按原樣編譯,難以專注於實際問題。 – Tunaki

+0

@tunaki正如我所說,它只是sudocode,我留下了部分邏輯的評論。我只是試圖從概念上證明這種差異。我不認爲跑步是需要理解的概念嗎? – dsollen

回答

0

如果a.equals(b),然後b.equals(a)您的等於方法通過對稱測試失敗。要解決這個問題最顯而易見的方法是檢查類,像這樣:

public boolean equals(Object other){ 
    if(other.getClass() != this.getClass()) return false; 
    return (id==other.id && otherId==other.otherId) 
    } 

說了這麼多,你可能希望允許一些對的子類被認爲是彼此相等的 - 在這種情況下,我建議你看看這個問題: Java - equals method in base class and in subclasses