1

好的,所以基本上我正在创建一个程序,它允许用户选择一个形状(三角形、正方形、圆形),然后它接受一个 int 并计算边界长度和面积。

我这样做没有问题,并且有一个运行良好的程序。(https://gist.github.com/anonymous/c63a03c129560a7b7434 4 个类)但是现在我必须用多态性概念来实现它,老实说,我正在努力解决如何做到这一点。

关于继承,我有一个基本的想法

                                       Main
                                         |
                                       Shapes
                                       /  |  \
                                triangle circle square

但是我不明白当三角形/正方形/圆形类中的所有方法都是唯一的时我应该如何覆盖,没有“抽象”方法可以从“形状”类继承。

如果有人可以快速查看我链接的代码并提出一种方法来做到这一点,那将不胜感激。

对不起,如果我不善于解释这一点。谢谢。

4

4 回答 4

1

我注意到您的形状对象之间没有通用接口。

你也许可以做这样的事情:

public interface Shape {
  // whatever polymorphic behavior you want
}

然后您的每个类都将像这样声明:

public class Circle implements Shape {
  // ...
}

public class Triangle implements Shape {
  // ...
}

public class Square implements Shape {
  // ...
}

等等

于 2013-10-22T21:44:12.677 回答
1

也许这可以是一个开始:

public abstract class Shape {
    protected double length;
    public Shape(double length) {
      this.length = length;
    }
    public abstract double getArea();
    public abstract double getBoundaryLength();
}

以及一种可能的实现

public class Circle extends Shape {
  @Override
  public double getArea() {
    return length * length * Math.PI;
  }
  @Override
  public double getBoundaryLength() {
    return 2 * length * Math.PI;
  }
}

主要内:

Shape shape = new Circle(scan.nextDouble()); // Use variable of type shape here

..

// this code is the same for all shapes
double boundaryLength = shape.getBoundaryLength(length);
double area = shape.getArea(length);
System.out.println("Boundary Length = " + Math.round(boundaryLength));
System.out.println("Area = " + Math.round(area));
于 2013-10-22T21:45:34.237 回答
1

这里的想法是将所有子类中出现的方法作为 Shape 中的抽象方法。如果这样做,您可以将 Shape 对象作为 Shapes 使用,而无需知道它们是哪种形状。例如,您这样做:

Shape c = new Circle(50);
System.out.println(c.getArea());

这将导致打印形状的正确区域,由圆计算,同时仍将其用作形状(第二行对其创建为圆的起源一无所知,但仍会计算为一个)。这只能通过使用继承来实现。

于 2013-10-22T21:46:27.783 回答
1

正如@KepaniHaole 提到的,您可以创建一个接口并让您的类实现它。另一种方法是创建一个abstract class,在其中实现三个类之间通用的方法,并保留它们自己的类不通用的方法的实现。

例如:

public abstract class Shape 
{
    int x, y;
    void moveTo(int newX, int newY)
    {
       //implementation
    }

   abstract void draw();
   abstract void resize();
}

somoveTo可以在三个类之间共享,而drawandresize可以由每个类单独实现。

好处abstract classes是您可以在它们甚至字段中实现方法。这对于接口是不可能的。

于 2013-10-22T21:52:39.447 回答