Лучший способ вызвать метод, унаследованный от базового класса: использовать this, super или вызывать неявно - PullRequest
1 голос
/ 21 сентября 2011

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

Ответы [ 6 ]

2 голосов
/ 21 сентября 2011

Если вы хотите быть уверены, что вызванный метод является методом суперкласса, определенно используйте super:

super.boo();

Если вы хотите использовать метод, определенный в текущем классе, и если его нет, используйте метод super:

this.boo();
//or
boo();

Лично во втором случае, если класс является частью иерархии, я предпочитаю явно использовать this.boo (), потому что чтение кода более понятно, чтобы понять, где должен находиться метод. Но это мое мнение.

2 голосов
/ 21 сентября 2011

Лучше всего использовать тот, который вы считаете самым ясным.

Кстати: первый пример будет вести себя иначе, чем третий, если вы добавите метод boo в Derived.

1 голос
/ 21 сентября 2011

Я бы использовал только 1 и 2 (в моем случае я предпочитаю 2, я хотел бы быть откровенным о своих намерениях)

public void useBoo(){
    this.boo();
}

Я бы не использовал 3, потому что это означает что-то другое семантически, помнитечто Derivative также может быть расширено, а boo() может быть переопределено далее по иерархии классов, и если вы не хотите специально вызывать Base.boo(), вам не следует использовать ключевое слово super.

1 голос
/ 21 сентября 2011

Используйте одно из первых двух, если вы явно не хотите ограничивать вызов реализацией суперкласса.

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

В другом месте, если вы используете третий и позже вы или кто-то другой переопределяете реализацию boo () суперкласса - в этом классе или подклассе - тогда useBoo () не будет использовать переопределение.Это обычно нежелательно, за исключением переопределения самой boo ().

Примеры:

/** Extends boo method. */
public void boo(){
    super.boo();   // Good: you explicitly want to call the superclass method, not call this method again.
}

public void doSomethingThatInvolvesBoo() {
    boo();        // Good -- will call this object's implementation,
                  // even if this is a subclass, even if there are code changes later.
    this.boo();   // Good (and equivalent to simply calling boo()).
    super.boo():  // Usually bad.
}
0 голосов
/ 21 сентября 2011

Имея в виду удобочитаемость super, вероятно, лучше, потому что здесь написано , я вызываю метод из суперкласса .

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

0 голосов
/ 21 сентября 2011

Что-нибудь мешает вам просто вызвать boo ()?Или вы переопределили это в своем собственном коде?1 и 2 делают то же самое, 3 вызывает метод Base.

edit: как сказал Симеон, использование super сделало бы очень ясным, что вы вызываете метод из Base класса.

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