1

基本上,我需要几种方法来做同样的事情,但子类可以选择不同的参数,并且仍然强制实现。这是正确的方法/设计吗?

编辑:我已经编辑了 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])
    }
}
4

4 回答 4

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> {
}
于 2012-08-17T16:03:51.107 回答
1

这是一个完美的案例:优先组合而不是继承。

您的子类不能完全从超类中受益,也不依赖于它的实现细节。然后为合约定义一个接口,B必须C遵守 ( addItemImpl()) 并用A.

问问自己:真的是一个?真的是和?BACA

于 2012-08-17T16:09:07.810 回答
1

你所拥有的在技术上是正确的,但是如果不知道addItem实际是什么,就很难知道这是否是最好的解决方案。我的猜测是可能有更好的方法。

如果addItem本质上设置要在 doStuff 中使用的值,我只会在 Class 中完成这项工作,BC不是。任何其他需要以与B扩展它相同的方式而不是A.

编辑:根据您的编辑,我会说这可能是使用抽象类的一个坏例子。没有真正共享的功能。一个接口会更合适,因为每个接口都需要不同的实现。您只是想将其隐藏在抽象类中。我会更改A为接口以及使用泛型。

只有在所有类中实际上存在完全相同的共享代码时才走抽象类路线,而无需采取任何技巧使其工作(如上所示)。

于 2012-08-17T16:02:50.163 回答
0

如果您需要强制实现少数方法,那么Abstract方法是理想的。

但要小心,只有超类的第一 Non-Abstract 个子类才能实现其中的所有抽象方法......

于 2012-08-17T15:58:00.510 回答