Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
#1

Абстракция - Android

17.01.2015, 12:52. Просмотров 316. Ответов 6
Метки нет (Все метки)

Плыть бобру,
тьфу,
быть добру!

Тут в свете вопроса где-то внизу по поводу убиения AlarmManager'a, подумал я кое что задумать, но...вопрос не в этом.

Из описалова

You do not instantiate this class directly; instead, retrieve it through Context.getSystemService(Context.ALARM_SERVICE).
а getSystemService - это оказалось не просто так - это

public abstract Object getSystemService (String name)

Собственно вопрос: как метод без реализации что-то возвращает, создает, инстанциирует, ...

Чё-то моя голова поломалась сутра.

Заранее благодарю за ответ
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2015, 12:52     Абстракция
Посмотрите здесь:

Абстракция текста [C++] C++
Абстракция C++
абстракция C++
Абстракция в С++ C++
Java абстракция Java SE
Интерфейс и Абстракция
C++ Абстракция классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
17.01.2015, 14:36     Абстракция #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сам класс Context абстрактный, то-есть не может быть экземпляра этого класса.
Везде где есть объект типа Context, например
Java
1
Context context = getBaseContext();
имеется на самом деле экземпляр класса наследующего Context и вот в классе наследнике уже есть реализация метода getSystemService()
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
17.01.2015, 15:29  [ТС]     Абстракция #3
Gabberr, точно же ж...
Спасибо

Добавлено через 46 минут
АЛЯРМА
АХТУНГ
АТТЕНСИОН


Поспешил...сростается да не всё...

Допустим имеем в Activity

Java
1
AlarmManager amAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE)
беру я всё это дело и еду по цепочке .

Для Activity таки есть перегруженный метод getSystemService(String name)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public Object getSystemService(String name) {
        if (getBaseContext() == null) {
           throw new IllegalStateException(
                    "System services not available to Activities before onCreate()");
        }
 
       if (WINDOW_SERVICE.equals(name)) {
          return mWindowManager;
       }
        return super.getSystemService(name);
   }
}
который фактически срабатывает только для константы WINDOW_SERVICE, а остальное сбрасывает на метод суперкласса, а именно класса ContextThemeWrapper

Java
1
2
3
4
5
6
7
8
9
@Override public Object getSystemService(String name) {
         if (LAYOUT_INFLATER_SERVICE.equals(name)) {
             if (mInflater == null) {
                 mInflater = LayoutInflater.from(mBase).cloneInContext(this);
             }
             return mInflater;
         }
         return mBase.getSystemService(name);
     }
который, в свою очередь, обслуживает только константу LAYOUT_INFLATER_SERVICE, а остальное сбрасывает на mBase.getSystemService(name), где mBase

Java
1
 private Context mBase;
Т.е. для константы ALARM_SERVICE вызывается абстрактный метод getSystemService класса Context

Я опять в потерях
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
17.01.2015, 15:36     Абстракция #4
Посмотрите на момент инициализации переменной
Java
1
 private Context mBase;
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
17.01.2015, 15:40  [ТС]     Абстракция #5
Конечно, смотрел

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ContextThemeWrapper extends ContextWrapper {
     private Context mBase;
     private int mThemeResource;
     private Resources.Theme mTheme;
     private LayoutInflater mInflater;
 
     public ContextThemeWrapper() {
         super(null);
     }
     
     public ContextThemeWrapper(Context base, int themeres) {
         super(base);
         mBase = base;
         mThemeResource = themeres;
     }
 
     @Override protected void attachBaseContext(Context newBase) {
         super.attachBaseContext(newBase);
         mBase = newBase;
     }
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
17.01.2015, 15:44     Абстракция #6
Ну тогда где и с какими параметрами вызывается конструктор или метод attachBaseContext, вы же понимаете что не может быть экземпляра абстрактного класса, по факту там скорей всего ContextWrapper или другой наследник
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2015, 17:43     Абстракция
Еще ссылки по теме:

Абстракция C#
Зачем нужна абстракция? C#
C# Абстракция, уровни абстракции
Наследование и абстракция C++
Абстракция «сокрытие информации»? C#

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
17.01.2015, 17:43  [ТС]     Абстракция #7
Та такое ж...
Ну, оставим эту затею - разбиратся в исходниках - дело неблагодарное само по себе.
Работа проделана большая, но, в итоге, бесполезная
Yandex
Объявления
17.01.2015, 17:43     Абстракция
Ответ Создать тему
Опции темы

Текущее время: 05:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru