【问题标题】:Define Methods in Interface Without Specifying Number of Parameters在接口中定义方法而不指定参数数量
【发布时间】:2021-08-05 10:00:17
【问题描述】:

我正在尝试从相同的接口实现类,但在方法中使用不同数量的参数,如下面的代码。

interface Shape {
    double getArea();
}

class Square implements Shape {
    @Override
    public double getArea(double side) { // error because different number of parameter
        return side;
    }
}

class Triangle implements Shape {
    @Override
    public double getArea(double height, double width) { // error because different number of parameter
        return height * width / 2;
    }
}

Java中有没有办法在接口中定义方法而不限制参数的数量?

【问题讨论】:

  • 这违背了界面的目的。你的类应该有一个构造函数来传递边或高度和宽度,然后有一个 getArea 尊重这些属性,但它本身不接受任何参数
  • 虽然您可以定义 double getArea(double... args);,但我认为这不是您正在寻找的特定示例的答案
  • @luk2302 我仍在努力更好地理解 OOP。谢谢你的建议!

标签: java oop interface overriding


【解决方案1】:

您可以使用省略号语法 (...),然后检查运行时传递给方法的参数数量:

interface Shape {
    double getArea(double... args);
}

class Triangle implements Shape {
    @Override
    public double getArea(double args...) {
        if (args.length != 2) {
             throw new IllegalArgumentExeption
                       ("A triangle should have a height and a width");
        }
        double height = args[0];
        double width = args[1];
        return height * width / 2;
    }
}

但这完全忽略了拥有接口并实现其方法的意义。

在 Java 中处理此问题的惯用方法是让每个形状在其构造函数中采用适当的参数,并实现依赖于其数据成员的无参数 getArea() 方法:

interface Shape {
    double getArea();
}

class Triangle implements Shape {
    private height;
    private width;

    public Triangle(double height, double width) {
        this.height = height;
        this.width = width;
    }

    @Override
    public double getArea() {
        return height * width / 2;
    }
}

【讨论】:

  • 此外,使用省略号的参数排序对于具有更多边的形状会造成混淆
【解决方案2】:

不幸的是,您不能实现接口的方法,然后将其参数(无论它们是否存在)更改为您喜欢的任何值。

但幸运的是,有一种简单而有效的方法可以解决您尝试使用每个类的构造函数执行的操作,该构造函数将根据类获取适当的参数

这是一个小例子

interface Area {
    double getArea(); }


// a Triangle class that implements the Area interface
class Triangle implements Area {

    // Here as you see, each class has specific attributes, specific constructor arguments and for sure a specific method body
  
    double base,height;

    Triangle(double base, double height){
        this.base = base;
        this.height = height;
    }

    @Override
    public double getArea() {
        return ((double) 1/2) * base * height;
    }
}
//a Square class that implements the Area interface 
class Square implements Area {

    double length;

    Square(int length){
        this.length = length;
    }

    @Override
    public double getArea() {
        return length*length;
    }
}

public class Class {
    public static void main(String[] args) {

        //Creating a square object
        Square square = new Square(4);
        //Creating a triangle object
        Triangle triangle = new Triangle(12,3);

        System.out.println("Square's Area is :"+square.getArea()); // output : Square's Area is :16.0
        System.out.println("Triangle's Area is :"+triangle.getArea()); // output : Triangle's Area is :18.0

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多