假设我有一个带有泛型函数的Math类,例如
public class math {
public double add(int a, int b){
//code
}
}
我有一个班级' students
'想要使用上述' add
'方法。我是否用数学课程扩展学生?或者创建它的实例?例如
math a = new math();
a.add
答案 0 :(得分:8)
在OO设计中,使用继承进行代码重用是一种反模式和不良实践。仅在存在IS_A
关系时使用继承。所以你能说students is a math
吗?如果不是,则没有理由使用继承。如果您的重用方法如此常见,那么您应该将它放在实用程序类中。
请参阅Composition over inheritance和Utility 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
方法。