Java: как установить родительские и прародительские переменные-члены с лучшей практикой кодирования - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть 3 класса

Class A{
  int a;
  int b;

  public A(){}

  public A(int a, int b){
     this.a = a;
     this.b = b;
  }
}

Class B extends Class A{
  int c;
  int d;
  public B(){}

  public B(int c, int d){
     this.c = c;
     this.d = d;
  }
}

Class C extends Class B{
  int f;
  public C(int f){
     this.f = f;
  }
}

Теперь я получаю объект B (с установленными значениями a, b, c & d) откуда-то, а также значение f, и я хочусоздайте новый экземпляр C со всеми установленными значениями.Следовательно, я создал новый конструктор в классе C

Class C extends Class B{
    int f;
    C(int f){
         this.f = f;
    }
    C(int f, B bInstance){
      super(bInstance);
      this(f); // because I wanted to only one base constructor
    }
}

Добавлен конструктор в B

Class B extends Class A{
  int c;
  int d;
  B(int c, int d){
     this.c = c;
     this.d = d;
  }
  B(B bInstance){
   super(B.getA(), B.getB());
   this(B.getC(), B.getC());
  }
}

Теперь this () и super () должны быть первым оператором.Следовательно, я не могу иметь это таким образом.Я делал это таким образом, чтобы сохранить только один базовый конструктор и любой другой конструктор, вызывающий этот.Вот ссылка, поддерживающая этот Лучший способ обработки нескольких конструкторов в Java .

В противном случае простое решение будет иметь новый конструктор в классе C и B

Class C extends Class B{
     int f;
     C(int f){
             this.f = f;
     }
     C(int f, B bInstance){
        super(bInstance);
        this.f = f;
     }
}

Class B extends Class A{
  int c;
  int d;
  B(int c, int d){
     this.c = c;
     this.d = d;
  }
  B(B bInstance){
   super(B.getA(), B.getB());
   this.c = c;
   this.d = d;
  }
}

Но я пытаюсь изучить лучшие стандарты кодирования и хотел знать, как реализовать его с помощью лучших практик кодирования.

1 Ответ

0 голосов
/ 19 декабря 2018

Вы создаете класс C, который расширяет B, если я правильно понимаю, вы хотите, чтобы C имел значения некоторого класса B, которые вы получаете каким-либо другим способом, где.

Когда вы расширяетекласс, который нужно вызвать super() в первой строке, чтобы вызвать конструктор суперкласса.Таким образом, ваши методы, такие как в вашем классе B, где у вас есть параметры B(int c, int d), должны иметь

B(int a, int b, int c, int d) {
    super(a, b);
    this.c = c;
    this.d = d;
}

Если вы этого не сделаете, вы получите ошибку компилятора, так как класс, который вы расширяете, имеетконструктор, который вы никогда не вызываете.

Я бы отформатировал его так ...

class A {
    private int a, b;

    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

class B extends A {
    private int c, d;

    public B(int a, int b, int c, int d) {
        super(a, b);
        this.c = c;
        this.d = d;
    }
}

class C extends B {
    private int f;

    public C(int a, int b, int c, int d, int f) {
        super(a, b, c, d);
        this.f = f;
    }
}

Итак, когда вы устанавливаете класс C, вы, возможно, должны вызвать new C(B.getA(), B.getB() ..etc)

...