Наследование Java: один и тот же метод разных объектов - PullRequest
0 голосов
/ 07 ноября 2019

скажем, у меня есть следующая простая конструкция:

public abstract class Geometry {
   ...
}

public class TriangleGeo extends Geometry {
   Triangle triangle;
}

public class RectangleGeo extends Geometry {
   Rectangle rectangle;
}

public class Rectangle {
   private size;
}

public class Triangle {
   private size;
}

Теперь у меня есть два метода:

public void calcSizeOfRect(Rectangle rect){
  System.out.println(rect.size);
}

public void calcSizeOfTria(Triangle tria){
  System.out.println(tria.size);
}

То, что я действительно хочу, это только один метод calcSize для обоих объектов,Потому что на самом деле методы делают 1: 1 одинаковыми и касаются только общих свойств.

Единственный возможный способ решить эту проблему - переместить переменную цвета в класс Geometry. Возможно, вы знаете другой подход к этому? Потому что рефакторинг будет много работы ..

Использование Java 9, если это имеет значение.

Ответы [ 4 ]

1 голос
/ 07 ноября 2019

Просто поместите абстрактный метод с именем calcSize() в abstract class Geometry и затем переопределите его в дочерних классах в соответствии с вашими требованиями.

Или

Создайте интерфейс с именем 2DShapes (потому что это имеет больше смысла, также используйте имя area, а не size, имеет больше смысла) и используйте метод calcSize() внутри этого. Затем реализуйте этот интерфейс для любого класса, который вам нравится в вышеописанном подходе.
Вам необходим полиморфизм (точнее, динамический полиморфизм)

1 голос
/ 07 ноября 2019

Лучше было бы объявить Interface для каждого типа.

interface BasicShape {
    public double getArea();
    public Color getColor ();
}

class Triangle implements BasicShape {
   double area;
   Color color;
   Triangle (int base, int height, Color color) {
      area = .5*base*height;
      this.color = color;
   }
   public Color getColor() {
       return color;
   }
   public double getArea() {
      return area;
   }

}

Затем для каждого типа реализовать соответствующий код.

1 голос
/ 07 ноября 2019

Все, что вам нужно сделать, это добавить следующий метод

public void calcSize(Geometry geometry) {
    // Implementation code
} 

Поскольку оба значения Triangle и Rectangle наследуются от Geometry, вы можете создать метод, который принимает экземпляр * 1007. *.

Если метод calcSize станет частью класса Geometry, вы даже можете просто сделать

public void calcSize() {
    // Implementation Code
}

Вы сможете это сделать, потому что в теории вы должныпотенциально уже есть детали для расчета размера. Это, однако, все зависит от других фактов в вашей реализации.

Другой вариант заключается в реализации interface, см. @ WJS ответ на этот вопрос.

0 голосов
/ 07 ноября 2019
public class SolutionGeometry {

    public static void calcSiz(Geometry geo){
         System.out.println(geo.size);
    }

    public static void main(String[] args) {    
        Triangle a = new Triangle();
        a.size = 6;
        calcSiz(a);
        Rectangle b = new Rectangle();
        b.size = 6;
        calcSiz(b);
    }
}

abstract class Geometry {
   int size;
   private int color;
}

class Triangle extends Geometry {

}

class Rectangle extends Geometry { 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...