我有一个方法doSomething()
的抽象超类A. A
的子类必须实现doSomething()
,但每次子类调用doSomething()
时都应该调用一些公共代码。我知道这可以实现:
public class A {
public void doSomething() {
// Things that every sub-class should do
}
}
public class B extends A {
public void doSomething() {
super.doSomething();
// Doing class-B-specific stuff here
...
}
}
但这似乎有三个问题:
有关如何实施这些方法的任何想法?
答案 0 :(得分:6)
以下情况如何?
public abstract class A {
protected abstract void __doSomething();
public void doSomething() {
// Things that every sub-class should do
__doSomething();
}
}
public class B extends A {
protected void __doSomething() {
// Doing class-B-specific stuff here
...
}
}
然而,第一个要点并不是那么清楚。如果您想要返回不同的内容,则签名无法匹配。
答案 1 :(得分:1)
将回调添加到doSomething()
public class A {
public void doSomething() {
// Things that every sub-class should do
doSomethingMore()
}
}
protected abstract void doSomethingMore()
所以所有子程序都必须使用其他操作ipmelment doSomethingMore(),但外部类将调用public doSomething()
答案 2 :(得分:0)
仅针对第一点 - 您可以考虑以下答案,并且为了强制执行子类实现,它可以是抽象的,但如果基类具有某些实现,则可能会发生调用公共代码功能。
返回类型可以是基类中的Object并返回null。在SubClass中,特定的返回类型可以如下所示。
public class InheritanceTutorial {
static class Base{
public Object doSomething(){
System.out.println("parent dosomething");
return null;
}
}
static class SubClass extends Base{
public Integer doSomething(){
super.doSomething();
System.out.println("child dosomething");
return 0;
}
}
/**
* @param args
*/
public static void main(String[] args) {
SubClass subClass = new SubClass();
subClass.doSomething();
}
}