修改抽象方法

时间:2014-09-16 20:36:04

标签: java oop abstract-class

是否可以修改或扩展抽象类方法的内容?

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,但需要进行少量修改。

4 个答案:

答案 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();
}