我有两个相似的类对象。我有一些第一类对象的方法,我也想重用于我的第二类对象,但我不确定如何以及我不想编写重复的方法。
我提取并简化了一个例子来说明我的想法。
头等舱
public class FirstClass {
int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
...
}
第二课
public class SecondClass {
int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
...
}
第三课
public class Main {
public static void main(String[] args) {
FirstClass firstClass = new FirstClass();
firstClass.setNumber(5);
SecondClass secondClass = new SecondClass();
secondClass.setNumber(5);
numberIsFive(firstClass);
numberIsFive(secondClass);
}
public void numberIsFive(Object myObject){
if(myObject instanceof FirstClass){
myObject = (FirstClass)myObject;
}else if(myObject instanceof SecondClass){
myObject = (SecondClass)myObject;
}
if(myObject.getNumber() == 5){
System.out.println("is five");
}else{
System.out.println("is not five");
}
...
}
}
并且没有numberIsIFive(firsclass.getNumber())不是一个选项,因为我使用的方法有更多的验证。
提前致谢
答案 0 :(得分:4)
对于这种可能过度工程"的情况,但总的来说,你会在这里看到组合,例如:
interface IntValueHolder {
int getNumber();
void setNumber(int value);
}
class IntValueHolderImpl implements IntValueHolder { ...
然后你会"掉落"您目前在两个类中都有的代码,相反,这两个类(以某种方式)都有一个IntValueHolder实例。
在你的情况下,简单地让你的两个类实现那个" common" interface IntValueHolder - 至少避免重复的instanceof调用和downcast(直到特定的类)。
编辑:当然,另一种选择是在这里使用继承 - 让你的两个类派生自一些提供这种行为的基类。但是使用继承只是为了避免代码重复大多数时候都是一个坏主意。类继承彼此,因为这使得" sense"在底层模型中,不要保存一行代码。
答案 1 :(得分:2)
在继续之前,我建议您自己阅读它和其他面向对象的编程概念。
关注这种特殊情况,您应该创建一个基类,例如
public class BaseClass {
int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
其中包括FirstClass
和SecondClass
的所有常用字段和方法。然后从当前的两个类中删除这些方法,并将它们创建为public class FirstClass extends BaseClass
,以便为它们提供BaseClass功能。
最后,您必须更改验证方法,只接受属于您的基类的对象,方法如下public void numberIsFive(BaseClass myObject)
(作为一般规则,您通过接受一个更少的错误方法中的特定类,而不是接受任何旧对象。)
编辑:其他回答者是正确的,继承也是一种有效的解决方案。您使用哪一个取决于您在申请环境中更有意义的内容。
答案 2 :(得分:1)
您应该创建一个interface并在两个类中应用它,然后让您的验证方法接收一个界面,而不是Object
示例:
public interface Number {
int get();
void set(int n);
}
然后你的课程将如下所示:
public class FirstClass implements Number {
int number;
@Override
public int get() {
return number;
}
@Override
public void set(int n) {
this.number = n;
}
}
您的验证方法会收到一个数字:
public void numberIsFive(Number myNumber){
...
}