Получить имя дочернего класса от родителя - PullRequest
27 голосов
/ 03 марта 2011

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

Ответы [ 6 ]

62 голосов
/ 12 июля 2012

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

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

17 голосов
/ 03 марта 2011

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

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

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

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

3 голосов
/ 03 марта 2011

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

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

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

2 голосов
/ 04 марта 2011

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

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

1 голос
/ 09 апреля 2014

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

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

0 голосов
/ 28 декабря 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...