С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
1

Абстракция

17.01.2015, 12:52. Просмотров 880. Ответов 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)

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

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

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

Абстракция в С++
Не думал , что столько проблем возникнет с этим на С++ , куда проще все это и...

абстракция
оъясните,пжлста,на примере суть абстракции

Абстракция
Мужики, объясните пожалуйста термин "Абстракция" в С++ на примере более...

Абстракция
Есть абстрактный класс, есть классы-наследники, реализующие методы абстрактного...

Java абстракция
Начал читать Герберт Шилдта. Надеюсь мой выбор правильный. Дошёл до описания...

6
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
17.01.2015, 14:36 2
Лучший ответ Сообщение было отмечено Armagedo как решение

Решение

Сам класс Context абстрактный, то-есть не может быть экземпляра этого класса.
Везде где есть объект типа Context, например
Java
1
Context context = getBaseContext();
имеется на самом деле экземпляр класса наследующего Context и вот в классе наследнике уже есть реализация метода getSystemService()
1
Armagedo
210 / 210 / 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

Я опять в потерях
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
17.01.2015, 15:36 4
Посмотрите на момент инициализации переменной
Java
1
 private Context mBase;
0
Armagedo
210 / 210 / 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;
     }
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
17.01.2015, 15:44 6
Ну тогда где и с какими параметрами вызывается конструктор или метод attachBaseContext, вы же понимаете что не может быть экземпляра абстрактного класса, по факту там скорей всего ContextWrapper или другой наследник
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
17.01.2015, 17:43  [ТС] 7
Та такое ж...
Ну, оставим эту затею - разбиратся в исходниках - дело неблагодарное само по себе.
Работа проделана большая, но, в итоге, бесполезная
0
17.01.2015, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2015, 17:43

Интерфейс и Абстракция
Верно ли то что Интерфейс, это тот же Абстрактный класс, но который содержит в...

Абстракция классов
Всем утра доброго ;) Люди знающие и люди опытные подскажите вот такую вещь: ...

Абстракция текста [C++]
Написал программу которая представляет собой абстракцию текста с классом...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru