2014-02-05 3 views
0

У меня есть 5 классов, все они расширяют BaseClass. Если в моем базовом классе выполняется метод, я хотел бы знать, какой из 5 классов назвал этот метод в моем базовом классе. Я не думаю, что могу передать переменную в своем супер-вызове. Это проект андроида, и вызов является предопределенным. Я подумал, что в моем BaseClass я могу назвать что-то вроде «getCallingClass» или что-то вроде этого.Кто называет мой суперкласс?

Любая идея?

+0

Вы имеете в виду ... кто называется методом или на объект какого типа является метод, который называется? –

ответ

1

вы можете сделать this.getClass();, чтобы получить класс вызывающего объекта.

вы можете получить имя класса по this.getClass().getName().

Или вы можете использовать оператор instanceof, чтобы проверить, к какому классу принадлежит вызывающий объект.

Таким образом, в вашей функции базового класса вы можете просто проверить:

if(this instanceof ClassA){ 

} 
0

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

0

Все пять детей вашего базового класса наследуют собственную версию своих методов родителя, исключая частные методы или конструкторы. Если class Fooextendsclass Bar, то каждый неличный метод в баре также находится в Foo.

Вызов this.getClass(); даст вам тот класс, в котором вы сейчас находитесь. Если вы позвоните в Foo, вы получите Foo. Если вы позвоните ему в баре, вы получите бары. Если Foo наследует метод, который живет в Bar, вы все равно будете Foo внутри этого метода.

+0

Эта часть ', тогда каждый метод в баре также находится в Foo, если только он не перезаписывается', это не так для частных методов, я думаю. Кроме того, конструкторы не наследуются. –

+0

@ peter.petrov Вы правы. Исправлен ответ. – Rainbolt

1

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

Переопределить метод в подклассе, вызывая метод суперкласса явно, а затем добавить свою собственную логику подкласса.

суперкласса:

public void aMethod() { 
    // do superclass logic here. 
} 

Подкласс:

@Override 
public void aMethod() { 
    super.aMethod(); 
    // Subclass-specific logic goes in the overriding method. 
} 
Смежные вопросы