Короткий ответ: Java не поддерживает то, что вы пытаетесь сделать, но хорошая новость заключается в том, что есть много способов обойти это.
Идея 1 : иметь Companion
переопределить hasCompanion
и просто всегда возвращать false
.
Идея 2 : Пусть Visitor
обеспечивает реализацию hasCompanion
, которая просто всегда возвращает false
. Затем Клиент переопределит hasCompanion
с помощью действующей логики, чтобы определить, есть ли у Клиента спутник.
Идея 3 : не назначайте hasCompanion
метод Visitor
, а используйте метод только в Client
. Затем код выполняет проверку типа во время выполнения с помощью оператора instanceof
и вызывает метод на Client
посредством приведения. Пример:
if (visitor instanceof Client) {
Client client = (Client) visitor;
boolean hasCompanion = client.hasCompanion();
// other logic
}
Это в лучшем случае фальшивый полиморфизм и очень грязное решение. Я бы посоветовал не делать этого, если это возможно.
Идея 4 : пересмотреть дизайн и реорганизовать дерево типов и то, как код использует наследование. Если нет смысла вызывать hasCompanion
на Companion extends Visitor
, почему hasCompanion
является методом Visitor
вообще?
Java не поддерживает множественное наследование, поэтому необходимы интерфейсы:
public interface MightHaveCompanion {
public boolean hasCompanion();
}
public abstract class Visitor {
// methods that all Visitors must have
}
public class Client extends Visitor implements MightHaveCompanion {
// overriding implementations of MightHaveCompanion and Visitor methods
}
public class Companion extends Visitor {
// overriding implementations of Visitor methods
}
Тогда вызывающий код должен будет измениться, чтобы использовать типы MightHaveCompanion
или Visitor
по мере необходимости. Понятно, какие методы принадлежат к каким типам. Не заблуждайтесь, что в больших проектах объем работы для этого будет масштабироваться, но это может привести к более чистому коду.