Basicaly我需要几个方法来做同样的事情,但是子类可以选择不同的参数,并且仍然强制实现。 这是正确的方法/设计吗?
编辑:我编辑了addItem()体,这些方法包含用于处理传递参数的最终逻辑
public abstract Class A {
public abstract void addItemImpl()
addItem(String s) {
// do stuff
}
addItem(Collection c) {
// do stuff
}
addItem(Item item) {
// do stuff
}
}
public Class B extends A {
addItemImpl() {
addItem("text, text2")
}
}
public Class C extends A {
addItemImpl() {
addItem([item, item2])
}
}
答案 0 :(得分:2)
不,这不起作用。
您将无法定义" doStuff()"方法,因为你必须处理参数。您提供的信息不足,无法为您提供详细的帮助。但是,仿制药可能会派上用场:
public abstract Class A<T> {
public addItem(T t) {
// dostuff with t
}
}
public Class B extends A<String> {
}
public Class C extends A<Collection> {
}
答案 1 :(得分:1)
您所拥有的技术上是正确的,但如果不知道addItem
实际上做了什么,很难知道这是否是最佳解决方案。我的猜测是,可能有更好的方法。
如果addItem
基本上设置了要在doStuff中使用的值,我只会在类B
和C
中执行此操作。任何其他需要以与B
相同的方式执行此操作的人可以将其扩展为A
。
编辑:根据你的编辑,我会说这可能是一个使用抽象类的坏例子。没有真正共享的功能。接口更合适,因为您需要为每个接口实现不同的实现。你只是试图在抽象类中隐藏它。我会将A
更改为界面以及使用泛型。
如果实际上共享代码在所有类中完全相同而不必使任何技巧使其工作(如上所述),则只进入抽象类路由。
答案 2 :(得分:1)
这是一个完美的案例:赞成合成而不是继承。
您的子类没有完全受益于超类,并且不依赖于其实现细节。然后为合同B
定义接口,C
必须遵守(addItemImpl()
)并使用A
撰写。
问问自己: B
真的是A
吗? C
真的是A
?
答案 3 :(得分:0)
如果您需要强制实施几种方法,那么Abstract
方法是理想的。
但要小心,只有超级类的第一个 Non-Abstract
子类必须实现其中的所有抽象方法....