繁体   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