Это единственный способ сделать унаследованные объекты? - PullRequest
0 голосов
/ 23 ноября 2018
public class Animal
{
    public String name;
    public boolean legs;
    public boolean eyes;

    public Animal(String name, boolean legs, boolean eyes)
    {
        this.name = name;
        this.legs = legs;
        this.eyes = eyes;
    }
}

public class Dog extends Animal
{
    String name;
    boolean legs;
    boolean eyes;
    public boolean vacinated;
    public boolean rabid;
    public Dog(boolean vacinated, boolean rabid, String name, boolean legs, boolean eyes)
    {
        super(name, legs, eyes);
        this.vacinated = vacinated;
        this.rabid = rabid;
    }
}

public class Bulldog extends Dog
{
    String name;
    boolean legs;
    boolean eyes;
    public boolean vacinated;
    public boolean rabid;
    public String breedtype;

    public Bulldog(String breedtype, String name, boolean legs, boolean eyes, boolean vacinated, boolean rabid)
    {
        super(vacinated, rabid, name, legs, eyes);
        this.breedtype = breedtype;
    }
}

Как вы можете видеть, если это будет продолжаться и продолжаться, другими словами, если у меня будет действительно длинная строка наследования, я бы серьезно перечислилкаждую переменную снова и снова?Я просто чувствую, что есть гораздо более эффективный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Это нарушение всей концепции ООП.Вы можете иметь общие переменные в родительском классе как protected переменные, чтобы к нему мог обращаться этот класс и его дочерние элементы.

Не только переменные, но и общие методы могут быть определены и реализованы в родительском классе как защищенные.

Подробнее здесь

0 голосов
/ 23 ноября 2018

Вот более простой пример одной из проблем с тем, что вы делаете:

class A {
  String a;

  A(String a) { this.a = a; }
}

class B extends A {
  String a;

  A(String a) { super(a); }
}

Этот код, вероятно, даст результаты, которые вы не ожидаете:

B b = new B("hello");
System.out.println(b.a);  // null

Это может вас удивить, потому что может показаться, что вы инициализировали a в конструкторе A с помощью вызова super(a).

Но что более удивительно, если вы приведете его к A, это не печать null:

System.out.println(((A) b).a);  // hello

, что выглядит странно: оно печатает что-то другое, когда вы рассматриваете его как другой тип.

Проблема здесь в том, что поля не являются полиморфными в Java: a в B скрывает * a в A.Оба поля есть, но когда вы ссылаетесь на a для переменной типа B, вы получаете другое поле, когда вы ссылаетесь на a для переменной типа A.

Чтобы это работало «менее запутанно», не повторяйте объявление a в B:

class A {
  String a;

  A(String a) { this.a = a; }
}

class B extends A {
  A(String a) { super(a); }
}

Сейчас:

B b = new B("hello");
System.out.println(b.a);  // hello
System.out.println(((A) b).a);  // hello
0 голосов
/ 23 ноября 2018

Ваши занятия нарушены ООП.Вы должны определить общие свойства, которые могут быть унаследованы дочерним классам protected.Это означает, что дочерние классы могут получить доступ к этим

Во-вторых, общие свойства должны быть определены в родительском классе и не должны быть воссозданы в дочерних.

P / S: обновлено комментарием BlackFlash,Я буду использовать частный модификатор для таких общих свойств.В рамках этого вопроса дочерним классам не требуется доступ к свойствам родителя.

Ваши классы должны быть изменены следующим образом:

public class Animal
{
  private String name;
  private boolean legs;
  private boolean eyes;

  public Animal(String name, boolean legs, boolean eyes)
  {
    this.name = name;
    this.legs = legs;
    this.eyes = eyes;
 }
}

public class Dog extends Animal
{
   private boolean vacinated;
   private boolean rabid;
   private Dog(boolean vacinated, boolean rabid, String name, boolean legs, boolean eyes)
    {
      super(name, legs, eyes);
      this.vacinated = vacinated;
      this.rabid = rabid;
  }
}

public class Bulldog extends Dog
{
   private String breedtype;
   public Bulldog(String breedtype, String name, boolean legs, boolean eyes, boolean vacinated, boolean rabid)
   {
    super(vacinated, rabid, name, legs, eyes);
    this.breedtype = breedtype;
  }
}
...