Код работает, как и ожидалось.
Я полагаю, что может быть некоторая путаница с тем, как работает super()
. Инструкции в суперструктурах почти «дублируются» в вашем подклассе и выполняются: нет никакой связи между вашим экземпляром подкласса и любым другим экземпляром (даже суперкласса)
Конструктор супер в чем-то вроде этого :
Monitor(float _x, float _y) {
x=_x;
y=_y;
w=random(50, 100);
h=(w*9)/16;
println(this,w,h);
}
и обратите внимание, что он печатает что-то вроде:
$Monitor@1dd41b82 85.673935 48.19159
$OldMonitor@40ceef5d 56.606354 31.841074
Он не печатает Monitor@
дважды.
Вторая проблема связана с логи c: даже если вы копируете / вставляете инструкции из суперкласса в подкласс, ширина инициализируется случайным значением: каждый раз, когда это вызывается, оно будет отличаться.
С точки зрения поведения - это звуки как вы хотите, чтобы экземпляр sublcass копировал ширину экземпляра суперкласса и обновлял высоту, используя его собственное соотношение сторон. Вот один из способов, которым вы могли бы реализовать это:
void updateFrom(Monitor otherMonitor){
w = otherMonitor.w;
h=(w*2)/3;
}
полный пример:
Monitor m1;
OldMonitor m2;
void setup(){
size(300,300);
m1 = new Monitor(10,10);
m2 = new OldMonitor(120,10);
// set w from monitor, maintaining aspect ratio
m2.updateFrom(m1);
}
void draw(){
background(0);
m1.display();
m2.display();
}
class Monitor {
float x; // pos x
float y; // pos y
float w, h; // width and height
Monitor(float _x, float _y) {
x=_x;
y=_y;
w=random(50, 100);
h=(w*9)/16;
println(this,w,h);
}
void display() {
rect(x, y, w, h);
}
}
class OldMonitor extends Monitor {
OldMonitor(float _x, float _y) {
super(_x, _y);
h=(w*2)/3;
}
// copy w from another monitor, but maintain aspect ratio
void updateFrom(Monitor otherMonitor){
w = otherMonitor.w;
h=(w*2)/3;
}
}