Ссылаясь на переменную мать класса (наследование) - PullRequest
1 голос
/ 18 марта 2020

Здравствуйте, пользователи StackOverflow, надеюсь, вы мне поможете. Извините за мой английский sh, это не мой родной язык.

Я новичок в обработке. Это то, что я хочу сделать: я хочу создать класс с именем «Monitor» со следующими свойствами: - когда вызывается экземпляр Monitor, construnctor создает прямоугольник по x, y позиции (определяется пользователем), ширине и высоте определяется случайным образом конструктором. Высота зависит от ширины с выражением.

Затем я хочу создать производный класс с именем "OldMonitor", свойства такие же, за исключением высоты. Я хочу, чтобы он составлял 2/3 ширины материнского класса Monitor, каждый раз, когда вызывается istance.

Так вот мой код:

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;
}

void display() {
  rect(x,y,w,h);
}

class OldMonitor extends Monitor {

OldMonitor(float _x, float _y) {
  super(_x, _y);
  h=(w*2)/3;
}

Но это не работает должным образом, потому что (я думаю), когда я вызываю super (_x, _y), переменная w в OldMonitor получает новое случайное значение, а затем выражение для установки значения в h зависит от этого нового значения. Я хочу, чтобы оно зависело от значения, сгенерированного в классе Mother. Надеюсь, это понятно для понимания.

Можно ли реализовать это, используя конструктор super ()?

Спасибо, я надеюсь, что текстовый код написан хорошо, я не знаю, как его здесь стилизовать.

1 Ответ

0 голосов
/ 15 апреля 2020

Код работает, как и ожидалось.

Я полагаю, что может быть некоторая путаница с тем, как работает 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;
  }

}
...