Скрытие Java: есть ли способ для клиентских классов называть `super`? - PullRequest
2 голосов
/ 26 января 2010

Помимо добавления метода явно в подкласс для вызова метода super, есть ли способ его временно "показать"? Я хотел бы вызвать метод super.blah() для экземпляра Test2. Должен ли я использовать метод, подобный originalBlah, или есть другой способ?

public class TestingHiding {
    public static void main(String[] args) {
        Test1 b = new Test2();
        b.blah();
    }
}

class Test2 extends Test1 {
    public void blah() {
        System.out.println("test2 says blah");
    }

    public void originalBlah() {
        super.blah();
    }
}

class Test1 {
    public void blah() {
        System.out.println("test1 says blah");
    }

}

Редактировать: Извините, что добавил к вопросу в конце игры, но у меня была вспышка памяти (я думаю): в C # это отличается? Что это зависит от того, какой у вас класс think (Test1 или Test2)?

Ответы [ 4 ]

3 голосов
/ 26 января 2010

Нет, нет способа подорвать понятие наследования таким образом.

3 голосов
/ 26 января 2010

Как я понимаю, вы хотите сделать что-то вроде Test1 b = new Test2(); b.super.blah(). Это не может быть сделано, super строго ограничен вызовом из подкласса суперкласса.

2 голосов
/ 26 января 2010

Трудно представить ситуацию, когда вам нужна такая вещь.

Вы можете запретить переопределение метода.
Также вы можете рассмотреть Шаблонный метод шаблонную технику.

1 голос
/ 26 января 2010

Простой ответ: вы не можете

ты мог бы быть бла

class Test2 extends Test1 {
    public void blah() {
        if("condition"){
            super.blah()
        }
        System.out.println("test2 says blah");
    }

}

или идите по пути OriginalBlah, или вообще отсоедините реализацию blah, чтобы иметь возможность вызывать любую реализацию, которая вам нужна, но это все.

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