【发布时间】:2014-05-23 15:28:45
【问题描述】:
我知道您不能在 Java 中扩展多个类。所以,我需要帮助解决这个问题。
我有这些课程:
abstract class ObjWithID {
final int id;
public ObjWithID(int id) {
this.id = id;
}
}
abstract class ObjWithIDActivity extends ObjWithID {
public ObjWithIDActivity(int id) {
super(id);
}
boolean active;
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
abstract class ObjWithIDPriority extends ObjWithID {
public ObjWithIDPriority(int id) {
super(id);
}
int priority;
public void setPriority(int priority) {
this.priority = priority;
}
public int getPriority() {
return priority;
}
}
我的一些课程(大部分)需要activity 和priority。所以,在一个完美的世界里,我会这样写:
class Employee extends ObjWithIDPriority, ObjWithIDActivity implements Comparable<Header> {
public Employee(int id) {
super(id);
}
@Override
public int compareTo(Header o) {
return Integer.compare(o.priority, priority);
}
}
当然,你不能扩展多个类。
在我当前的代码中,我只是创建了第三个类:
abstract class ObjWithIDActivityPriority extends ObjWithID {
public ObjWithIDActivityPriority(int id) {
super(id);
}
boolean active;
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
int priority;
public void setPriority(int priority) {
this.priority = priority;
}
public int getPriority() {
return priority;
}
}
但是,这导致我不得不编写更多代码,因为如果我创建一个接受ObjectWithIDActivity 作为参数的方法,我需要为ObjWithIDActivityPrioritys 复制它。
我已经尝试过使用interfaces 的多重继承解决方法,但这会导致问题,因为我正在使用字段int id、int priority 和boolean active 以及这些字段的getter/setter。另外,接口不能有构造函数。
那么,实现这一点的最佳方法是什么?三等舱是唯一的选择吗??
【问题讨论】:
-
“优先组合而不是继承”。不幸的是,并非没有样板。
-
使用 Java 8!接口的多重继承! :D
-
@DirkyJerky 在这种情况下不起作用,因为您不能拥有实例变量。
-
既然你可以争辩说任何活动都必须有一个优先级,为什么不让 ObjWithIDActivity 扩展 ObjWithIDPriority 呢?
-
我认为没有足够的信息来提供解决方案。此类问题的答案取决于整个应用程序的整体设计需求;您不能简单地将其简化为一个小测试用例并问“答案是什么?”。在这种情况下,我不明白为什么需要
ObjectWithIDActivity或ObjectWithIDPriority抽象类,而不是单独的Activity或Priority类,它们将成为某些对象中的实例字段。它看起来像一种“设计气味”。也许有充分的理由,但我不能从一个小例子中看出。