繁体   English   中英

为高中生开发有关Java接口的示例

[英]Developing an example for high school students about java interfaces

我想创建一个名为NUMBER的Java接口的示例,该接口由两个Java类FRACTION和COMPLEX实现。 我在使其工作时遇到问题。

例如:我有一个名为add的FRACTION方法,带有以下标头-

public Fraction add(Fraction f) 

以及带有以下标头的称为add的COMPLEX方法-

public Complex add(Complex c).

当我在接口中定义方法为

public Object add(Object o) 

并编译分数,我得到的错误是分数方法不会覆盖接口NUMBER中的抽象方法。

问题在于,当您进行编译时,Java会看到接口具有一个名为add的方法,该方法可以输出Object ,但是在实现类中,它找不到任何返回Object方法名称add 您可以改为使接口的方法返回Number ,并根据该类型转换输出。 您必须记住,尽管所有方法都必须返回该Number类型。

另一种选择是使用泛型。 我不完全确定具有泛型类型的重写方法如何工作,但是您可以在Number类中使用如下所示的内容:

<T> T add(T t);

我不确定这是否行得通,因为我没有在接口中使用泛型,但是可能会。

您也许还可以执行以下操作:

public interface Number<T extends Number> {
    T add(T t);
}

分数:

public class Fraction implements Number<Fraction> {
    @Override public Fraction add(Fraction f) {
        ...
    }
}

分数:

public class Complex implements Number<Complex> {
    @Override public Complex add(Complex c) {
        ...
    }
}

这样做可以让您使用更具体的类型定义方法,并且应该可以很好地工作,但是两件事是我不确定是否认为“最佳实践”为接口的类型包括相同的类,并且如果您愿意向学生展示通用类型。 它们是一个非常简单但功能强大的概念,但是如果您不想解释,那么第一个解决方案可能最适合您。

您的接口应为通用类型,以适应返回类型参数类型的接口方法要求,请检查以下代码:

首先,您必须将通用接口类Number定义为:

package com.oop.concepts;

public interface Number<T extends Number> {
    T add(T t);
}

一旦具有带有返回类型T和参数类型T的泛型添加,就可以如下实现:

package com.oop.concepts;

public class Fraction implements Number<Fraction> {

    private float a;

    public Fraction(float a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "Fraction{" +
            "a=" + a +
            '}';
    }

    @Override
    public Fraction add(Fraction n) {
        return new Fraction(this.a + n.a);
    }
}

对于复杂类也是如此:

package com.oop.concepts;

public class Complex implements Number<Complex> {

    private Double x;
    private Double y ;

    public Complex (Double x, Double y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString() {
        return "Complex{" +
            "x=" + x +
            ", y=" + y +
            '}';
    }

    @Override
    public Complex add(Complex n) {
        return new Complex(this.x + n.x, this.y + n.y);
    }
}

测试类别:

package com.oop.concepts;

public class TestNumber {

    public static void main (String args[]) {

        Complex c1 = new Complex(3.4, 56.78);
        Complex c2 = new Complex(3.4, 56.78);

        Complex c3 = c1.add(c2);

        System.out.println(c3);

        Fraction f1 = new Fraction(3.4f);
        Fraction f2 = new Fraction(1.0f);
        Fraction f3 = f1.add(f2);

        System.out.println(f3);


    }
}

以上测试用例的输出:

Complex{x=6.8, y=113.56}
Fraction{a=1.0}
Fraction{a=4.4}

希望这与JAVA中的泛型一起清楚地理解OOP概念

我将这些代码推送到github中, 看看

正如一些评论所指出的那样,方法的签名不能更改。

如您的示例所示,您将在两个类中放入相同的代码,这并没有以最佳方式展示继承。

我使用并看到多次使用的一个示例是使用形状的面积和周长。 为简便起见,我的示例仅显示一种方法的示例,并假设变量和构造函数已正确制作。

public interface Shape{
    public abstract double area();
    public abstract double volume();
}
public class Rectangle implements Shape {
    ...
    public double area() {
        return width * height;
    }
    ...
}
public class Circle implements Shape {
    ...
    public double area() {
        return Math.PI * Math.pow(radius, 2);
    }
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM