2010-09-27 5 views
1

Скажем, у меня есть классы, объявленные как это:Как вызвать метод базового класса?

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(); 

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

+0

добавить явный вызов родительскому методу. например validate() {return super.validate(); } – Andreas

+0

Как вы его протестируете, так как метод 'validate()' базы и подкласса возвращает 'true'. –

+0

Не могли бы вы объяснить его вариант использования? –

ответ

9

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

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

Но зачем вы хотите это делать? Это немного дизайнерский запах. Вы можете найти chain of responsibilty pattern интересным.

+0

Спасибо, это не мой дизайн, я просто его кодирую :). – dcp

+0

Добро пожаловать. Я вижу, удачи с кодированием :) – BalusC

+1

затем задайте вопрос о качестве дизайна - скажем, дизайнеру, что он сосет;) – Bozho

0

Вы можете, но только в подклассе:

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

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

0

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

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

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

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

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

Смежные вопросы