b b_instance = new b ();
внутри экземпляра c, вызываемая мной функция b calc () вернет 0. Я думаю, это потому, что b имеет свою собственную эко-сферуданные?
Как мне это сделать?
«Пара» возможных способов.Я бы рассмотрел расширение c
с b
, таким образом c
получает всю функциональность a
и b
, что-то вроде ...
class c extends b {
void run() {
set_number(1);
System.out.println(calc());
}
}
ЕСЛИ, однако, этонеосуществимо (по той или иной причине), тогда вам нужно передать значение, которое c
имеет b
, что-то вроде ...
class c extends a {
void run() {
set_number(1);
b b1 = new b();
b1.set_number(get_number());
System.out.println(b1.calc());
}
}
Теперь, сказав, что это "пахнет "для меня.Какой смысл расширяться с a
, чтобы c
мог выполнять b
?Это вызвало бы у меня тревожные звонки.
Проблема в том, что если ваш звонок c#calc
, он просто перейдет к a
calc
методу ... который, основываясь на run
,кажется, что это не то, чего вы хотите достичь, так что это просто большой беспорядок
2)
Кроме того, как я могу вызвать функцию суперкласса с тем же именем?
Поскольку вызов calc
напрямую вызовет StackOverflowError
, потому что вы постоянно звоните себе.
В этом случае вы выполняете операцию, для которой a
делать и вносить изменения в него.Это обычная практика в языках OO.
Примечания ...
Java (и сообщество Java) уже имеют четко определенный набор методов кодирования.Вам нужно потратить время на их изучение, это облегчит чтение вашего кода и облегчит чтение кодов других людей.
Начните с Условные обозначения для языка программирования Java TM
Имена классов должны начинаться с заглавной буквы, а методы - в camelCase
, например ...
class A {
private int number;
void setNumber(int n) {
number = n;
}
int getNumber() {
return number;
}
int calc() {
return number * 2;
}
}
Обновлено ...
class a {
void calc_a() {
System.out.println("");
}
void calc_b() {
calc_a(); // meaning the calc_a() in the superclass
}
}
class b extends a {
void calc_a() {
super.calc_b();
}
}
class c extends a {
void run() {
b b1 = new b();
b1.calc_b();
}
}
Вопрос, который вам нужно задать себе: почему b
нужно переопределить calc_a
?Почему бы не переопределить calc_b
?Это решило бы проблему
как мне это переопределить?
class b extends a {
//void calc_a() {
// super.calc_b();
//}
@Override
void calc_b() {
super.calc_b();
}
}