Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

И это все, что есть.

Ответ 4

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

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

Ответ 5

В вашем супер-классе создайте метод для условия, отвечающего за ответ на вопрос - является подклассом один из типа 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;
    }
}

Подробнее см. Голливудский принцип.

Ответ 6

Вы также можете использовать метод .getClass() для родителя, а затем, например, проверьте

if(parent.getClass().equals(childObj.class)){
//to do ..
}

Это в основном работает, потому что возвращает класс объекта времени выполнения. Это особенно сработает в случае абстрактных классов. Недавно пробовал и тестировал меня в моем проекте.