当前位置: 首页 > 知识库问答 >
问题:

如何有效地利用接口上的继承和多态性

胡星汉
2023-03-14

我创建了一个接口“Polygon”,用于存储抽象方法:“area”和“permiture”。然而,当实现多边形的类在计算面积和周长时涉及不同的计算时,我不理解如何有效地使用接口。在我看来,我甚至不需要接口“多边形”,因为它在我的代码中没有用处。

我已尝试在Triangle类中重写方法“area”,但收到以下错误:

三角形不是抽象的,并且不会覆盖多边形中的抽象方法area()

因为三角区有建造者。我不能修改多边形区域方法,使其具有与三角所需的相同数量的构造函数,因为它不适合我的矩形类。

public interface Polygon {

    void area();

    void perimeter();
}


class Triangle implements Polygon{

    private double triangleArea;
    private double trianglePerimeter;


    public Triangle (){};

    public void area(){}; //I've tried overriding method here but get a 
        compiler error since it is not identical to the Polygon method.

    public  double area(double base, double height){

       triangleArea = base * height * (.5);
       return triangleArea;
    }


public class Project25 {


public static void main(String[] args) {


    Triangle testTriangle = new Triangle();
    testTriangle.area(2, 2);
    testTriangle.printArea();

我已经设法在代码中获得了所需的答案,即面积和周长,但我需要知道如何修改代码以利用继承和多态性。

共有3个答案

傅正豪
2023-03-14

我看到的第一个问题是,您没有在实现接口的类中声明permiture方法,因此这将导致编译器错误。至于其他人所说的,您在这两个方法上都返回了一个值,所以它们不应该是void方法。

另外,为什么在Triangle类中使用重载方法?

谢翰学
2023-03-14

我想,

  1. Polygon接口中的方法应返回值(面积和周长)

所以,

>

  • 类三角形应该有一个构造函数

    public Triangle (final Double base, final Double height) {
       this.base = base;
       this.height = height;
    };
    

    你的面积法应该是,

     @Override
     public Double area() {
      return base * height * (0.5d);
     }
    

    你应该像下面这样使用它,

    final Polygon polygon = new Triangle(13, 212);
    final Double area = polygon.area();
    final Double perimeter = polygon.perimeter();
    

  • 扈翰
    2023-03-14

    接口的目的是作为对象公共特征的抽象视图。

    对于多边形,您已经确定了它们的一些共同点,即所有多边形都有一个区域,并且它们都有一个周长。

    抽象视图将获得这些公共值:

    public interface Polygon {
        double getArea();
        double getPerimeter();
    }
    

    当然,只有当多边形被完全定义时,您才能获得这些值,例如,对于三角形,基部和高度可能足以计算面积,但不能计算周长。相反,你通常使用3边的长度。

    public class Triangle implements Polygon {
        private final double a;
        private final double b;
        private final double c;
    
        public Triangle(double a, double b, double c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        @Override
        public double getArea() {
            // Using Heron's Formula
            double p = (a + b + c) / 2;
            return Math.sqrt(p * (p - a) * (p - b) * (p - c));
        }
    
        @Override
        public double getPerimeter() {
            return a + b + c;
        }
    }
    

    矩形更容易。

    public class Rectangle implements Polygon {
        private final double width;
        private final double height;
    
        public Rectangle(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        @Override
        public double getArea() {
            return width * height;
        }
    
        @Override
        public double getPerimeter() {
            return (width + height) * 2;
        }
    }
    

    如你所见,由于计算面积的输入是不同的,根据多边形的类型,面积方法不能取一组公共的参数,因此它们必须嵌入多边形对象中,所以我们可以得到一个公共的面积方法。

     类似资料:
    • 问题内容: 我认为多重继承在Java中总是非法的,但是这段代码可以编译: 是否有一个空接口,例如被认为是不好的做法?有没有一种方法可以避免空接口(使用泛型或其他方式)实现相似的目的? 注意:我不是在问如何通过接口模拟多重继承。我意识到我可以执行以下操作: 由于各种原因,我需要同时具有这两种方法的接口。 问题答案: 实现的 多重继承是不允许的。组件可以继承多个接口。 继承多个接口没有问题,因为您只是

    • 本文向大家介绍PHP接口多继承及tarits实现多继承效果的方法,包括了PHP接口多继承及tarits实现多继承效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP接口多继承及tarits实现多继承效果的方法。分享给大家供大家参考,具体如下: 接口多继承 在PHP的面向对象中,接口可以继承接口。PHP类只能继承一个父类(单继承),但是接口可以实现多继承,可以继承一个或者多个接口

    • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

    • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

    • 在面向对象编程中,当我们已经创建了一个类,而又想再创建一个与之相似的类,比如添加几个方法,或者修改原来的方法,这时我们不必从头开始,可以从原来的类派生出一个新的类,我们把原来的类称为父类或基类,而派生出的类称为子类,子类继承了父类的所有数据和方法。 让我们看一个简单的例子,首先我们定义一个 Animal 类: class Animal(object): def __init__(self,

    • 我试图了解使用接口的好处是什么,以便我可以知道何时以及如何使用它们。互联网上的大多数资源都是相对表面的,解释了接口是如何工作的,但现在为什么要使用它们,当我查找名义上的问题时,我没有得到任何结果告诉我接口的目的是否超出了多态性和多重继承。 我的推理是,如果一个接口只被一个类继承,它将是无用的,当一个接口被多个类继承时,它没有区别,除非它用于多态,唯一使实现不同于扩展的是多重继承。 如果我确实知道他