繁体   English   中英

在实现的抽象方法中调用超类方法

[英]Calling super class method inside implemented abstract method

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])
    }
}

不,这不行。

您将无法定义“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> {
}

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

如果addItem基本上设置了要在doStuff中使用的值,我只会在B类和C类中执行此操作。 任何其他需要以与B相同的方式执行此操作的人可以将其扩展而不是A

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

如果实际上共享代码在所有类中完全相同而不必使任何技巧使其工作(如上所述),则只进入抽象类路由。

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

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

问问自己: B真的是A吗? C真的和A

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM