Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于我的程序和多态性的问题_Java_Polymorphism - Fatal编程技术网

Java 关于我的程序和多态性的问题

Java 关于我的程序和多态性的问题,java,polymorphism,Java,Polymorphism,好的,基本上我正在创建一个程序,允许用户选择一个形状(三角形、正方形、圆形),然后输入一个int并计算边界长度和面积 我做这件事没有问题,我有一个工作完美的程序。(4个类)但现在我必须用多态性的概念来实现这一点,我真的很难做到这一点 在继承方面,我有一个基本的想法 Main |

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

我做这件事没有问题,我有一个工作完美的程序。(4个类)但现在我必须用多态性的概念来实现这一点,我真的很难做到这一点

在继承方面,我有一个基本的想法

                                       Main
                                         |
                                       Shapes
                                       /  |  \
                                triangle circle square
但我不明白当三角形/正方形/圆形类中的所有方法都是唯一的时,我应该如何重写,因为没有“抽象”方法可以从“Shapes”类继承

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


如果我不善于解释的话,我很抱歉。谢谢。

我注意到图形对象之间没有公共接口

你可以这样做:

public interface Shape {
  // whatever polymorphic behavior you want
}
public class Circle implements Shape {
  // ...
}

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

public class Square implements Shape {
  // ...
}
然后你的每个类都会这样声明:

public interface Shape {
  // whatever polymorphic behavior you want
}
public class Circle implements Shape {
  // ...
}

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

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

等等。

我注意到图形对象之间没有公共接口

你可以这样做:

public interface Shape {
  // whatever polymorphic behavior you want
}
public class Circle implements Shape {
  // ...
}

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

public class Square implements Shape {
  // ...
}
然后你的每个类都会这样声明:

public interface Shape {
  // whatever polymorphic behavior you want
}
public class Circle implements Shape {
  // ...
}

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

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

等等。

也许这是一个开始:

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));

也许这是一个开始:

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));

这里的想法是让所有子类中出现的方法都以抽象方法的形式出现。如果这样做,则可以将形状对象作为形状使用,而不必知道它们是哪种形状。例如,您可以执行以下操作:

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

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

这里的想法是让所有子类中出现的方法都以抽象方法的形式出现。如果这样做,则可以将形状对象作为形状使用,而不必知道它们是哪种形状。例如,您可以执行以下操作:

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

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

正如@KepaniHaole所提到的,您可以创建一个接口并使您的类实现它。 另一种方法是创建一个
抽象类
,在它内部实现三个类之间通用的方法,并保留它们自己的类不通用的方法的实现

例如:

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

   abstract void draw();
   abstract void resize();
}
因此,
moveTo
可以在三个类之间共享,而
draw
resize
可以由每个类单独实现


抽象类
的好处在于,您可以在它们内部甚至字段中实现方法。这在接口中是不可能的。

正如@KepaniHaole所提到的,您可以创建一个接口并使您的类实现它。 另一种方法是创建一个
抽象类
,在它内部实现三个类之间通用的方法,并保留它们自己的类不通用的方法的实现

例如:

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

   abstract void draw();
   abstract void resize();
}
因此,
moveTo
可以在三个类之间共享,而
draw
resize
可以由每个类单独实现


抽象类
的好处在于,您可以在它们内部甚至字段中实现方法。这在接口中是不可能的。

好吧,它们都共享一个类似的构造函数
a(double)
。它们都有共同的方法:
getArea(double)&getBoundaryLength(double)
。如果将所有这些作为抽象方法和必需的构造函数放入抽象类中,它应该可以工作。getArea和getBoundaryLength肯定可以抽象。记住,抽象意味着“在两个不同的事物中找到共同点”,你到底想要什么?您是否试图访问派生类中特定派生类所特有的方法?嗯,它们都共享一个类似的构造函数
a(double)
。它们都有共同的方法:
getArea(double)&getBoundaryLength(double)
。如果将所有这些作为抽象方法和必需的构造函数放入抽象类中,它应该可以工作。getArea和getBoundaryLength肯定可以抽象。记住,抽象意味着“在两个不同的事物中找到共同点”,你到底想要什么?您是否试图访问派生类中特定派生类所特有的方法?我想我会这样做,我非常感谢您的帮助。如果这有道理的话,我想我自己的想法被搞糊涂了。谢谢:)我想我会这样做的,我真的很感谢你的帮助。如果这有道理的话,我想我自己的想法被搞糊涂了。谢谢:)非常感谢,但我想我会同意米莎的回答。谢谢你花时间帮我。非常感谢你,但我想我会同意米莎的回答。谢谢你抽出时间来帮我。