簡體   English   中英

將超類中實現的方法轉換為抽象

[英]Turning a method implemented in superclass into abstract

我有一個帶有以下類的Java程序

public class A{
     protected String name;
     ...
     @Override
     public boolean equals(Object obj){
          if(!(obj instanceof A)){
              return false;
          }

          A a = (A)(obj);
          return a.name.equals(this.name);
     }
}

public abstract class B extends A{
    @Override
    public boolean equals(Object obj){
        return equals2(obj);
    }

    public abstract boolean equals2(Object obj);
}

public class C extends B{
    private String data;
    ...
    @Override
    public boolean equals2(Object obj){
        if(!(obj instanceof C)){
            return false;
        }

        C c = (C)(obj);
        if(c.data.equals(this.data)){
            return c.name.equals(this.name);
        }else{
            return false;
        }
    }
}

有沒有辦法強迫所有擴展class B實現自己的equals方法,而不必像示例一樣使用equals2

謝謝

我能想到的唯一方法是在Bequals拋出一個異常:

public abstract class B extends A {
    @Override
    public boolean equals(Object obj) {
        throw new UnsupportedOperationException();
    }
}

這將確保未能覆蓋equalsB子類不會回退到Aequals實現。

不幸的是,這將導致運行時異常,而不是編譯時錯誤,后者是更可取的。

讓我煩惱的是,您可以讓抽象類B在其equal()方法中引發異常:

public abstract class B extends A{
    @Override
    public boolean equals(Object obj){
        throw new UnsupportedOperationException("add your own implementation");
    }

    public abstract boolean equals2(Object obj);
}

這樣, B任何子類嘗試默認使用繼承的equals方法都將無法工作,從而迫使他們實現自己的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM