2011-11-08 51 views
1

以下是此作業的5個類別之一的選定代碼。覆蓋equals()方法以允許異源對象

每個類都必須有一個equals()方法,該方法可以將其類的對象與任何以及所有5個類的對象進行比較。

我的策略是爲了精確性而將每個對象值轉換爲double值。

隨着每個類的擴展Number每個類都有一個doubleValue()方法來使用。

代碼將不會編譯除非我執行之前的doubleValue類型強制轉換x至RationalN()

但在執行時另一個類的對象進行比較,因爲它不能被類型強制轉換到類它抱怨的代碼時。

我該從哪裏出發?

 public class RationalN extends Number{ 
      private int numerator; 
      private int denominator; 

      public RationalN(int x, int y){ 
      if (y == 0){ 
       throw new ArithmeticException("cannot devide by zero"); 
      } else { 
       this.numerator=x; 
       this.denominator=y; 
      } 
      } 

      public double doubleValue(){ 
      double value = (double)numerator/(double)denominator; 
      return (double)value; 
      } 

      public boolean equals(Object x){ 
      if (((RationalN)x).doubleValue() == this.doubleValue()){ 
        return true; 
       } else { 
        return false; 
      } 
     } 
+0

準備接受哪些類作爲equals()函數的有效參數? –

+0

你想確保'x'與'this'具有相同的類。如果'x'不是null並且'x.getClass()== this.getClass()'那麼它們是同一個類。如果你的類是'final','instanceof'也可以。 –

+0

其他類還擴展了'java.lang.Number'嗎?那麼超類「Number」需要實現的其他抽象方法呢? – Gevorg

回答

3

從我的帖子中得到的內容,您希望檢查等於您的對象表示的數值是否等於參數對象的數值。所以比較的類別是不是合適。相反,你的equals()方法有太多是這個樣子:

public boolean equals(Object x) { 
    if(this == x) 
     return true; 
    if(x == null) 
     return false; 
    if(!(x instanceof Number)) 
     return false; 
    Number n = (Number)x; 
    return (n.doubleValue() == this.doubleValue()); 
} 

然而,這違反了equals()合同: 新RationalN(1,1).equals(新的整數(1))將返回true,但新的Integer(1).equals(new RationalN(1,1));不會 - 上面的equals()方法違反對稱性。因此,引入一個實現Number的抽象類(比如說MyNumber)是合適的,它擴展了只有由你的五個類實現,並以上述方式(使用instanceof MyNumber)實現equals()。

+0

+1提及違反等值合同 –

1

編輯:我剛剛意識到該號碼有doubleValue()作爲Number類中的抽象方法。好吧,這是完美的。只需在這五個類中實現equals。或者,如果Number不是抽象類所必需的,那麼請閱讀以下內容,以瞭解您可以創建自己的抽象類來實現equals()並保存重複的代碼。

public boolean equals(Object x) 
{ 
    if(x instanceof Number == false) 
    return false; 

    Number other = (Number) x; 

    return other.doubleValue() == doubleValue(); 
} 

你之所以不能做你在平等正在做的事情,是因爲你是鑄造無論你是想以比較的RationalN類。如果對非RationalN的類執行此操作,則會導致ClassCastException。

由於所有類都擴展Number並且doubleValue()被聲明爲可用於Number的方法,現在可以將這些類轉換爲Number(如果它們是Number的實例),然後從那裏訪問該方法。

我希望這是有道理的。我鼓勵你閱讀接口和多態。另外,如果你不需要擴展Number,你可以創建一個具有抽象方法doubleValue()的抽象類,然後你可以提供一個具體的equals(我在上面提供)的實現。抽象類。然後讓所有五個類擴展抽象類。然後他們會分別執行他們自己的版本doubleValue(),但會共享您的抽象類中定義的equals(),從而消除equals()複製/粘貼到所有五個類中。如果您不必擴展Number,這將是理想的路線。

+0

我喜歡這個,但是我們不允許爲這個任務使用接口。謝謝! –