Java: вызов супер-метода, который вызывает переопределенный метод - PullRequest
82 голосов
/ 04 января 2011
public class SuperClass
{
    public void method1()
    {
        System.out.println("superclass method1");
        this.method2();
    }

    public void method2()
    {
        System.out.println("superclass method2");
    }

}

public class SubClass extends SuperClass
{
    @Override
    public void method1()
    {
        System.out.println("subclass method1");
        super.method1();
    }

    @Override
    public void method2()
    {
        System.out.println("subclass method2");
    }
}



public class Demo 
{
    public static void main(String[] args) 
    {
        SubClass mSubClass = new SubClass();
        mSubClass.method1();
    }
}

мой ожидаемый результат:

метод подкласса1
метод суперкласса
метод суперкласса2

фактическая выработка:

метод подкласса1
метод суперкласса1
метод подкласса2

Я знаю, что технически я переопределил публичный метод, но я подумал, что, поскольку я вызывал супер, любые вызовы внутри супер останутся в супер, этого не происходит. Любые идеи относительно того, как я могу это сделать?

Ответы [ 12 ]

1 голос
/ 04 января 2011

Я не верю, что вы можете сделать это напрямую. Одним из обходных путей было бы иметь частную внутреннюю реализацию метода 2 в суперклассе и вызывать его. Например:

public class SuperClass
{
    public void method1()
    {
        System.out.println("superclass method1");
        this.internalMethod2();
    }

    public void method2()
    {
        this.internalMethod2(); 
    }
    private void internalMethod2()
    {
        System.out.println("superclass method2");
    }

}
0 голосов
/ 06 октября 2017

Во время моего исследования аналогичного случая я в конечном итоге проверил трассировку стека в методе подкласса, чтобы выяснить, откуда поступил вызов. Возможно, есть более разумные способы сделать это, но у меня это получается, и это динамичный подход.

public void method2(){
        Exception ex=new Exception();
        StackTraceElement[] ste=ex.getStackTrace();
        if(ste[1].getClassName().equals(this.getClass().getSuperclass().getName())){
            super.method2();
        }
        else{
            //subclass method2 code
        }
}

Я думаю, что вопрос о том, чтобы найти решение по делу, является разумным. Конечно, есть способы решить проблему с разными именами методов или даже с разными типами параметров, как уже упоминалось в теме, но в моем случае я не хотел бы путать с разными именами методов.

...