У меня есть два класса A и B, как показано ниже
public class A {
Number x;
public A (){
x = 10;
}
public void setX(Number x){
//do a bunch of super complicated and lengthy stuff
// afterwards set x
this.x = x;
}
}
public class B extends A{
int x;
public B(){
super();
}
public void setX(int x){
super.setX(x);
}
public int getX(){
return x;
}
}
, и мой Main равен
public class Main {
public static void main(String[] args) {
B test = new B();
test.setX(9);
System.out.println(test.getX());
}
}
Выходной сигнал равен 0. Я хочу, чтобы это было 9. Я понимаю, что вВ этом тривиальном примере я мог бы просто написать x = 9 в своем методе на B, но если бы это был более сложный метод, в котором я не хотел бы переписывать весь код, уже написанный в моем методе суперкласса, то как бы я это сделал??
РЕДАКТИРОВАТЬ: в подклассе BI я специально вызываю мою переменную int x, чтобы скрыть переменную суперкласса x.Представьте, что метод setX в суперклассе выполняет множество других действий, прежде чем, наконец, установить x.Я хочу, чтобы он установил х подкласса.Это возможно?Это тривиальный пример.В моей реальной проблеме это намного сложнее.
РЕДАКТИРОВАТЬ: реальная проблема заключается в следующем.У меня есть класс с именем ColorBinaryTree
, который является подклассом BinaryTree
.единственное отличие состоит в том, что у класса ColorBinaryTree
есть поле для цвета, поэтому я могу реализовать красно-черное дерево.Класс BinaryTree ссылается на parent, left и right, которые являются объектами BinaryTree.Класс ColorBinaryTree имеет те же ссылки, но они являются объектами ColorBinaryTree вместо объектов BinaryTree.У меня есть куча методов, которые манипулируют деревом.Одним примером может быть следующий
public BinaryTree<E> root() {
if (parent == null) return this;
else return parent.root();
}
В моем подклассе мне нужно переопределить это, чтобы я мог сделать ковариантный тип возврата и вернуть объект ColorBinaryTree.Но было бы неплохо, если бы я мог вызвать метод суперкласса внутри моего метода подкласса.Но кажется, что если я вызываю метод суперкласса, он смотрит на родительское поле суперкласса.Я хочу, чтобы он посмотрел на родительское поле подкласса.