Intereting Posts
Android 2.2 SDK нарушает совместимость со старыми телефонами Tab + ViewPager не обновляет вместо этого показывает странное предупреждение ожидаемое состояние 3 найдено 2 Android Media Player не останавливается Отправка данных из службы в действие Android Lint Check – StringFormatInvalid: что не так на% d %% осталось? Преобразование base64 String в изображение на Android Как сделать снимок карты Google без фактического отображения карты Android ant build: proguard не может найти ссылочный метод в классе ViewConfigurationCompatFroyo Мой BroadcastReceiver не получает намерения BOOT_COMPLETED после моих ботинок N1 UI Automator в проекте с minSdkVersion 9 Java.lang.RuntimeException: невозможно создать службу .GCMIntentService InflateException: двоичная строка XML-файла # 22: ошибка раздувания класса <unknown> Android Google Maps v2, MAP_TYPE_NONE и черные квадраты Просмотр изображений в Android из URL-адреса Поймать исключение из дочерней активности в родительской деятельности

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

У меня есть базовый класс для всех моих действий ( 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; } } 

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