【问题标题】:Questions about my program and Polymorphism关于我的程序和多态性的问题
【发布时间】:2013-10-22 21:38:10
【问题描述】:

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

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

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

                                       Main
                                         |
                                       Shapes
                                       /  |  \
                                triangle circle square

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

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

对不起,如果我解释得不好。谢谢。

【问题讨论】:

  • 嗯,它们都共享一个相似的构造函数A(double)。它们都有共同的方法:getArea(double) & getBoundaryLength(double)。如果将所有这些作为抽象方法和必需的构造函数放入抽象类中,它应该可以工作。
  • getArea 和 getBoundaryLength 绝对可以抽象出来。请记住,抽象意味着“找到 2 个不同事物的共同部分”
  • 您到底想要什么?您是否尝试访问特定派生类独有的派生类中的方法??

标签: java polymorphism


【解决方案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));

【讨论】:

  • 我想我会这样做,非常感谢您的帮助。如果这有意义的话,我想我自己的想法很混乱。谢谢:)
【解决方案2】:

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

你也许可以这样做:

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

然后你的每个类都将被声明如下:

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

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

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

等等

【讨论】:

  • 非常感谢,但我想我会接受 micha 的回答。感谢您抽出宝贵时间帮助我。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    例如:

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

    所以moveTo 可以在三个类之间共享,而drawresize 可以由每个类单独实现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2020-12-11
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      相关资源
      最近更新 更多