是否可以修改或扩展抽象类方法的内容?
public abstract class MainClass{
public void func(){
// content...
}
}
public class FirstClass extends MainClass{
public void func(){
// content from MainClass
// own content
}
}
public class SecondClass extends MainClass{
public void func(){
// content from MainClass
// other content
}
}
我在两个类中都需要方法func
,但需要进行少量修改。
答案 0 :(得分:1)
以下内容:
public abstract void func(){
// content...
}
不能存在,因为抽象方法没有正文。如果你有一个带有正文的抽象方法,那将是一个编译时错误。
但是,您始终可以call the superclass method:
public class MainClass{
public void func(){
// base content...
}
}
public class FirstClass extends MainClass{
public void func(){
super.func();
// own content
}
}
public class SecondClass extends MainClass{
public void func(){
super.func();
// other content
}
}
答案 1 :(得分:1)
我认为你可以找到有趣的模板方法模式的使用。可能它解决了你的问题。
http://en.wikipedia.org/wiki/Template_method_pattern
public abstract class MainClass {
public final void sharingcode() {
// content from MainClass
// write here the common code
concreteCode(); // Calling abstract method to be implemented by implementations
}
protected abstract void concreteCode();
public class FirstClass extends MainClass {
@Override
public void concreteCode() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
public class SecondClass extends MainClass {
@Override
public void concreteCode() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
}
答案 2 :(得分:0)
您无法修改或扩展方法的内容,无论是否为抽象类。您可以覆盖方法 - 即提供新的方法实现;您也可以使用super
关键字super.originalMethod()
从父类调用“原始”方法。
答案 3 :(得分:0)
我认为Ezequiel是最好的答案,但是想要将战略模式作为另一种选择。你基本上放弃了子类化,并将行为差异注入MainClass:
public abstract class MainClass{
private final Behaviour behaviour;
public MainClass(Behaviour behaviour) {
this.behaviour = behaviour;
}
public void func(){
// content...
behaviour.execute();
}
}
public interface Behaviour {
void execute();
}