在java中正确使用'extend'类

时间:2014-05-13 08:09:15

标签: java

假设我有一个带有泛型函数的Math类,例如

public class math {

  public double add(int a, int b){
    //code
  }

}

我有一个班级' students'想要使用上述' add'方法。我是否用数学课程扩展学生?或者创建它的实例?例如

math a = new math(); 
a.add 

4 个答案:

答案 0 :(得分:8)

在OO设计中,使用继承进行代码重用是一种反模式和不良实践。仅在存在IS_A关系时使用继承。所以你能说students is a math吗?如果不是,则没有理由使用继承。如果您的重用方法如此常见,那么您应该将它放在实用程序类中。

请参阅Composition over inheritanceUtility class了解更多信息......

答案 1 :(得分:7)

像这样的“辅助方法”最好的方法可能就是以静态的方式使用它们,只要它是一个像这样的微不足道的任务。您的班级名称也应以大写字母开头。

像这样:

public class Math
{

    public static double add(int a, int b)
    {
    //code
    }

}

并像这样访问:

Math.add(1,2);

注意: 这只是OP应该使用的建议,以正确使用'extend'的答案,请参阅طاهر's answer

答案 2 :(得分:0)

将函数添加为静态更有意义,然后您可以在Student类中执行Math.add(1,1)

答案 3 :(得分:0)

Student扩展Math毫无意义,因为学生不是数学对象。学生是一个人,因此您可以拥有Person课程,然后Student extends Person

如果你想让两个方法的add方法有点类似,那么 可以做的就是创建一个接口Addable,它声明有这样一个{ {1}}方法。它可能看起来像这样:

add

public interface Addable<S, T, U> {
    S add(T a, U b);
}

public class Student implements Addable<Student, Student, Integer> {
    private int age;

    Student(int age) {
        this.age = age;
    }

    public Student add(Student a, Integer b) {
        return new Student(a.age + b);
    }

    public int getAge() {
        return age;
    }
}

这只是为了解释继承是如何工作的;制作一个public class Math implements Addable<Double, Integer, Integer> { public Double add(Integer a, Integer b) { return Double.valueOf(a + b); } } 这样的方法没有多大意义,因为其他一些答案已经指出了。做一个像这样的东西(一个独立于对象的实际实例的函数)而不是add方法。