【问题标题】:An advice for a design between parent and child classes?对父类和子类之间设计的建议?
【发布时间】:2017-09-11 23:42:36
【问题描述】:

我正在做一个物理模拟。

我有一个ArrayList,它包含我模拟中的所有对象。我有一个父类:Shape,还有两个子类:CircleRectangle

当然,父类没有draw() 方法,但每个子类都有。因此,当我通过列表循环绘制每个元素时,它不允许我,因为Shape 类中没有draw() 方法(因为我将列表定义为ArrayList<Shape>,并为每个新元素添加一个子类实例)。

有没有一种方法可以很好地解决这个问题?

【问题讨论】:

  • 你想要一个abstract 方法。
  • 我尝试将形状类定义为抽象,然后添加抽象方法绘制,但仍然没有工作@SLaks
  • 如果你真的在 ArrayList 中创建一个 Circle 对象,那么它就可以正常工作
  • 现在可以使用了,谢谢!
  • 我很困惑这个问题是如何获得 5 票的,因为在过去 20 年的任何 Java 基础教程和继承中,它已经被回答了 1000 次。而且,几乎所有的书都准确地对待 Shape 示例,谈论抽象方法。呵呵。

标签: java class parent-child simulation


【解决方案1】:

它似乎为Shape 类提供了一个抽象方法,其中所有子类共享一个共同的行为最适合手头的任务。

考虑这是Shape 类:

public abstract class Shapes{
    public abstract void Draw();
}

Rectangle 类:

public class Rectangle extends Shapes{
    public void Draw(){
        System.out.println("Rectangle");
    }
}

Circle 类:

public class Circle extends Shapes{
    public void Draw(){
        System.out.println("Circle");
    }
}

现在考虑到CircleRectangle 都是Shape 类型,您可以创建Circle 或/和Rectangle 类型的对象,将它们添加到ArrayList,迭代它,然后调用Draw() 每个对象的方法如下:

ArrayList<Shapes> shapes = new ArrayList<>();
shapes.add(new Circle());
shapes.add(new Rectangle());
shapes.forEach(Shapes::Draw);

在每个对象上调用Draw() 方法时的结果:

Circle
Rectangle

【讨论】:

    【解决方案2】:

    我会这样做。

    一个名为 Shapes 的类,它有一个 ListShape> 字段 Shape 是一个包含方法 draw() getArea() 或任何其他方法的接口。 拥有尽可能多的实现形状、圆形、矩形、正方形等的类。

    【讨论】:

      【解决方案3】:

      最好的前进方式是使用接口。

      public interface Shape {
          void draw();
      }
      
      public class Rectangle implements Shape {
          @Override
          public void draw() { // draw rect }
      }
      
      public class Circle implements Shape {
          @Override
          public void draw() { // draw circle }
      }
      

      如果您希望 Shape 与其子级共享一些其他逻辑,您可以使用任何附加代码创建一个实现 Shape 的 AbstractShape 类,并使用此抽象类扩展子类。

      【讨论】:

      • 由于这个接口只声明了一个draw()方法,我将接口命名为Drawable,而不是Shape
      • @AJNeufeld 是的,那会更好。按照惯例,接口应该是形容词后的名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2013-07-25
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多