Доступ к функции суперкласса с использованием объекта подкласса - PullRequest
5 голосов
/ 12 марта 2010

У меня есть объект подкласса, расширяющий его суперкласс. В подклассе есть переопределенный метод, который можно вызвать с помощью объекта. Можно ли вызвать функцию суперкласса, используя объект подкласса?

package supercall;

public class Main {

    public static void main(String[] args) {
        SomeClass obj = new SubClass();
        obj.go();   //is there anything like, obj.super.go()?
    }

}

class SomeClass {
    SomeClass() {

    }
    public void go() {
        System.out.println("Someclass go");
    }
}

class SubClass extends SomeClass {
    SubClass() {

    }
    @Override
    public void go() {
        System.out.println("Subclass go");
    }
}

Рассмотрим код выше.

Вот оно печатает

Подкласс go

. Вместо этого я должен напечатать

Суперкласс go

.

Ответы [ 5 ]

16 голосов
/ 12 марта 2010

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

3 голосов
/ 03 декабря 2012

Вот оно печатает Подкласс идти , Вместо этого я должен напечатать Суперкласс go

Хорошо, тогда не переопределяйте метод go @ subclass, он вызовет реализацию суперкласса.

Если вы хотите запустить супер реализацию и иметь некоторый другой дополнительный код @ подкласс, вы вызываете super.go (); а затем запустите некоторые другие заявления.

Это нормально, так как вы повторно используете уже написанный код, вы не должны копировать-вставлять код из суперкласса и помещать его в подпрограммы, поскольку это дублирование кода. Но если ваша цель - полностью изменить поведение, не называйте super

2 голосов
/ 12 марта 2010

Вместо:

System.out.println("Subclass go");

запись

super.go();

(Или, вы знаете, просто не реализуйте этот метод ...).

0 голосов
/ 12 марта 2010

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

class SubClass extends SomeClass {    
SubClass() {}    
    @Override    
    public void go() {    
        super.go
    }
}
0 голосов
/ 12 марта 2010

Есть ли способ добиться этого? Нет, нет.

Во время выполнения JVM выберет методы для вызова на основе типа экземпляра (для вас это полиморфизм), а не на основе типа, который объявлен.

Ваш экземпляр является экземпляром подкласса, поэтому будет вызван метод go () в этом подклассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...