我只是想知道是否有任何方法可以创建两个不相关但具有相同方法实现的类。我知道有接口和静态方法,但似乎只有在类中有静态字段时,它们才是好的。当方法使用特定于精确对象的字段时,是否有可能做这种事情? 我知道编写这样的代码是一种不好的做法,但是我很好奇。
编辑: 我的意思是这样的:
public class Person implements MakingOlder {
private int age;
}
public class Cat implements MakingOlder {
private int age;
}
public interface MakingOlder {
public static void makeOlder() {
this.age += 2;
}
}
我不想为Person和Cat创建通用基类,并且接口不起作用。我试图避免两次编写相同的实现并复制代码。
答案 0 :(得分:3)
当然,这被称为“组成+委托”,通常最好的做法是用以下方法代替继承:
https://en.wikipedia.org/wiki/Composition_over_inheritance
public class Person implements AgingObject {
private int age;
private AgingBehavior agingBehavior;
void makeOlder() {
agingBehavior.makeOlder(this);
}
//(...)
}
public class Cat implements AgingObject {
private int age;
private AgingBehavior agingBehavior;
void makeOlder() {
agingBehavior.makeOlder(this);
}
//(...)
}
public class AgingBehavior {
void makeOlder(AgingObject agingObject) {
agingObject.setAge(agingObject.getAge() + 2);
}
}
public interface AgingObject {
int getAge();
void setAge(int age);
}
答案 1 :(得分:1)
...或者您可以在Java 8+中使用默认实现...
public interface MakingOlder {
public default void makeOlder() {
setAge(getAge() + 2);
}
int getAge();
void setAge(int age);
}
当然还有您的Person and Cat实现MakingOlder
...
答案 2 :(得分:0)
您的界面可能无法正常运行,因为您正在尝试在界面中实现方法:
public static void makeOlder() {
this.age += 2;
}
为了使其正常运行,请尝试添加default
关键字,使其看起来像:
default Integer makeOlder(Integer age) {
age += 2;
return age;
}
然后,实现该接口的类将只需要包含以下内容:
public class Dummy implements AA {
Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
要测试结果,您可以调用以下内容:
Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());