Как вызвать метод базового класса? - PullRequest
1 голос
/ 27 сентября 2010

Скажем, у меня есть классы, объявленные так:

public abstract class IdentifiableEntity  {
    public boolean validate() {
        return true;
    }
}

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validate() {
        return true;
    }
}

Теперь, допустим, у меня создана переменная PreferenceCategory, и я хочу вызвать метод IdentifiableEntity.validate (), , а не метод PreferenceCategory.validate ().

Я бы подумал, что смогу сделать это с приведением (см. ниже), но он по-прежнему вызывает переопределенный метод:

PreferenceCategory cat = new PreferenceCategory();

// this calls PreferenceCategory.validate(), not what I want
((IdentifiableEntity)cat).validate(); 

Есть лиспособ сделать это?

Ответы [ 4 ]

9 голосов
/ 27 сентября 2010

Вы не можете. Лучше всего добавить к PreferenceCategory еще один метод, который вызывает метод super validate().

public boolean validateSuper() {
    return super.validate();
}

Но почему вы хотите это сделать? Это немного дизайнерский запах. Вы можете найти цепочку шаблонов ответственности интересной.

0 голосов
/ 27 сентября 2010

Нет способа сделать это в Java, кроме как внутри подкласса с super.methodName ().Даже с отражением.Другие языки, такие как Ruby, могут делать это с отражением.

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

0 голосов
/ 27 сентября 2010

Если вы разыгрываете, он все равно будет использовать метод переопределения. Так что вы должны сделать что-то подобное ...

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validate() {
        return true;
    }
    public boolean validateSuper(){
        return super.validate();
    }
}

Затем вы вызываете validatesSuper, он должен работать, бот далек от хорошего OO-программирования, и я действительно не рекомендую вам это делать; Если вам нужно вызвать другую валидацию, вы должны просто дать другое имя этому методу и вызвать его, когда вам нужно, или вызвать валидацию, чтобы вызвать метод суперкласса сейчас, а не переопределять, как это ...

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validatePreferenceCategory() {
        return true;
    }
}

вы по-прежнему можете звонить в validade из суперкласса

0 голосов
/ 27 сентября 2010

Можно, но только в подклассе:

public boolean simpleValidate() {
    return super.validate();
}

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

...