Превращение метода, реализованного в суперклассе, в абстрактный - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 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как пример?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вдобавок к моей голове, у вас может быть абстрактный класс 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 метод не будет работать, заставляя их реализовать свою собственную версию.

0 голосов
/ 04 июня 2018

Единственный способ, которым я могу придумать, - это выбросить исключение в B s equals:

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

. Это обеспечит то, что подклассы B, которые не смогут переопределить equals не вернется к реализации A equals.

К сожалению, это приведет к исключениям времени выполнения, в отличие от ошибок времени компиляции, которые предпочтительнее.

...