Получить дочернее имя класса от родителя

У меня есть базовый класс для всех моих действий ( ActivityBase ), который сам происходит из android.app.Activity . В onCreate я хочу выполнить некоторую условную логику на основе текущего исполняемого дочернего класса. Если SomeCustomActivity и AnotherCustomActivity расширяют ActivityBase , как я могу определить в родительском классе ( ActivityBase ), какой из двух является исполняемым в настоящее время?

Solutions Collecting From Web of "Получить дочернее имя класса от родителя"

Используйте оператор instanceof .

Предположим, что у вас есть базовый класс и два подкласса Base , SubOne и SubTwo , если вы хотите проверить, является ли переменная ref экземпляром SubOne или SubTwo вы бы сказали:

 if(ref instanceof SubOne){ } else if(ref instanceof SubTwo){ } 

Обратите внимание, что: (ref instanceof Base) всегда будет возвращать true .

В некоторых случаях эта строка в родительском классе решает эту проблему. Он возвращает имя «дочернего» класса (а не родителя):

 this.getClass().getName() //String like "com.mycompany.myclassname" this.getClass().getSimpleName() //String like "myclassname" 

См. Здесь для дальнейшего обсуждения: http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent

Я думаю, вы хотите использовать оператор instanceof, например:

 if(this instanceof SomeCustomActivity) { // do stuff } else if (this instanceof AnotherCustomActivity) { // do other stuff } 

И это все, что нужно.

Вместо использования оператора if вы должны создать абстрактный метод для вашей условной логики. Затем пусть дочерний класс выполнит правильный код.

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

В вашем суперклассе метод создания для условия, отвечающего за ответ на вопрос, – это подкласс класса X. В логике обработки этот метод используется для определения того, какой блок кода выполнить. Каждый подкласс может переопределять метод принятия решения и отвечать по мере необходимости. В результате ваш суперкласс не знает о подклассах, а подклассы не должны беспокоиться о фактической обработке.

 abstract class A { abstract boolean isItX(); void doX() { ... } void doY() { ... } void process() { if (isItX()) { doX(); } else { doY(); } } } class B extends A { boolean isItX() { return true; } } class C extends A { boolean isItX() { return false; } } 

Для получения дополнительной информации см. Голливудский принцип .