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

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

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

ООП подмена статик функции в наследнике - Программирование Android

29.12.2014, 08:19. Просмотров 430. Ответов 6
Метки нет (Все метки)

Гуру ООП явы, помогите!

Есть класс сервиса. В нем есть статик "запускатель" Start. В этом запускателе вызывается другая статик функция с параметром parm.

Создаю наследника. Хочу оставить Start, но подменить значение выдаваемое функцией parm! Не получается...

Код примерно такой (упростил):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// предок
public class MyParent extends Service {
 
    protected static int parm() { return 15; }
 
    public static void Start(Context context, java.lang.Class<?> service_cls) {
        TempUse(parm()); // зачем-нибудь используем значение из параметра
        context.startService(new Intent(context, service_cls));
    }
 
}
 
// наследник
public class My extends MyParent {
 
    protected static int parm() { return 1000; } // Start эту функцию не замечает! :(
//    protected static int parm() { return super.parm(); } // Сразу ругается на super :(
 
}
 
// использование (например в активити)
My.Start(this, My.class);
Увы получаю класс с параметром 15 вместо 1000

Возможно ли вообще такое???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2014, 08:19     ООП подмена статик функции в наследнике
Посмотрите здесь:

Подмена потока с микрофона - Программирование Android
Нужно подменипть поток с микрофона, чтобы отправить его при разговоре. Типа диалер, который вместо звука с микрофона будет пускать другой...

ООП - класс в классе - Программирование Android
Запутался в ООП! Создал класс ААА. В нем публичный класс с параметрами BBB. Создал другой независимый класс CCC. В пытаюсь создать...

Книги по ООП на android - Программирование Android
Подскажите книги по ООП что бы Android обьяснялось

Тонкости ООП в SurfaceView. Можно ли написать графический движок? - Программирование Android
Гуру ООП, помогите! Задумал написать свой микро-графический-движок. Хочу обьединить работу с Canvas и с OpenGL в одном классе....

Вызов функции родительского класса в наследнике - C++
Подскажите, пожалуйста, можно ли вызвать функцию родительского класса если в наследнике уже есть функция с таким же именем? Если да, то как...

Задача: подмена адреса функции из DLL. - C++
Здравствуйте уважаемые программисты. Пожалуйста, помогите решить задачу. Нужно в моей программе подменить адрес функции причём из длл, во...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 839
29.12.2014, 09:45     ООП подмена статик функции в наследнике #2
Tester64, а если TempUse(parm()); заменить на TempUse(service_cls.parm());
желаемого эффекта не получим?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
29.12.2014, 13:23  [ТС]     ООП подмена статик функции в наследнике #3
Цитата Сообщение от androbro Посмотреть сообщение
а если TempUse(parm()); заменить на TempUse(service_cls.parm());
желаемого эффекта не получим?
Неа!
Говорит что-то вроде "у типа class нет такого метода".
Даже когда тип класс попробовал заменить прямой ссылкой на тип выдало ошибки (на этот раз не до конца понятные)
Java
1
2
3
4
5
6
7
8
9
public static void Start(Context context, MyParent  service_cls) {
        TempUse(parm()); // зачем-нибудь используем значение из параметра
        context.startService(new Intent(context, service_cls.getClass()));
} 
 
// здесь без ошибок, но... когда переделал активацию на 
 
My.Start(this, My);
//не знает такого параметра My
Добавлено через 1 минуту
И даже если "по новому", то функция в наследнике "остается серой" - значит компилятор (ан-студия) заранее вычислил что ее никто не использует...

Добавлено через 3 часа 21 минуту
Разобрался - сделал по другому... Переопределил Старт с другими параметрами, а функцию заменил константой и передал в старт у наследника... Повезло что parm() выдавал константу!
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 839
29.12.2014, 13:54     ООП подмена статик функции в наследнике #4
Tester64, да как вариант, я бы тоже на каком нибудь таком решении остановился:
Java
1
My.Start(this, My.class, My.parm());
может и неправильно) зато работает))
Kastaneda
Форумчанин
Эксперт С++
4510 / 2852 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 1
Завершенные тесты: 1
29.12.2014, 22:24     ООП подмена статик функции в наследнике #5
Похоже была попытка использовать static метод как виртуальный. Java не позволяет такого, что в общем-то логично - ссылка на таблицу виртуальных методов хранится в объекте, а для static методов объект не нужен, т.е. позднее связывание организовать не получится.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.12.2014, 08:50  [ТС]     ООП подмена статик функции в наследнике #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Похоже была попытка использовать static метод как виртуальный. Java не позволяет такого, что в общем-то логично - ссылка на таблицу виртуальных методов хранится в объекте, а для static методов объект не нужен, т.е. позднее связывание организовать не получится.
Погуглил... Похоже статик метод нельзя подменить по определению. Разве что скрыть (свой метод-пустышка будет выдаваться вместо оригинального от предка).

Пишу будильник. Вернее неубиваемый сервис(частая распространенная инструкция в инете), жестко выдаваемый ежесекундные/минутные проверки. Делаю универсальный класс сервиса(люблю писать универсальные классы, которые могу использовать в нескольких проектах без изменений), который берет на себя все обработки таймера, запуск, остановку и т.д. Пытаюсь в наследнике от этого класса подменять лишь установку частоты срабатываний. Константой. И обработчик на срабатывания. Такое легко портировать между проектами, расширять сложность проверок(например раз в минуту мне уже мало - надо подгонять под первые секунды каждой минуты) и глобально выявлять недоделки.

Мне надо...
1) Передавать время срабатывания в предок. Решил добавлением лишнего параметра в Start, перекрываемом в наследнике.
2) Передавать класс сервиса-наследника в предка для перезапуска в классе встроенном в сервис(Receiver отвечающий за перезапуск сервиса). Вынужден был в переопределенном классе ресивера встроенном в предка переопределять функцию возвращающую класс внешнего сервиса. Код наследника чуть раздулся. Нельзя забывать переопределять этот метод. Но пока работает...

По ходу возник вопрос... У меня вся эта конструкция получилась довольно массивной (сервисы, алармы, сложный перезапуск по таймеру через ресивер)! Очень сложый внутри... Долго добивался (тестировал) минимальной нагрузки на процессор даже при срабатывании 3 раза в секунду. А ведь по сути это аналог часиков на виджетах на рабочий стол(некоторые даже с секундной стрелкой)! Они тоже никогда не останавливаются. Не замирают в случае даже подвисания устройства... Могут работать несколько недель без сбоев... И точность очень высокая. Может я изобретаю велосипед и подобное решение уже существует и даже встроено в ядро?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2014, 16:14     ООП подмена статик функции в наследнике
Еще ссылки по теме:

Подмена функции вызываемой по горячей клавише в Word - Visual Basic
Я пишу Add-in к Word на VB, который добавляет мой собственный CommandBar и Мои пункты меню в Word. Все это делается через интерфейс...

Статик + конструктор - C++
class A { public: A() { a = 10; b = 20; } private: static int a, b;

Статик и линк - C++ Qt
Сделал программу на qt не очень сложную, свой интерфейс. Нужно теперь это передать знакомому. Думал сделать все статической библиотекой, но...

Шаблоны и статик - C++
Добрый вечер. Вот кусочек кода, почему то переменная dx постоянно обнуляется хотя она static. В чем проблема? template &lt;class T, int n&gt;...


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

Или воспользуйтесь поиском по форуму:
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.12.2014, 16:14     ООП подмена статик функции в наследнике #7
Tester64, static нельзя переопределить. Так как статик методы и филды принадлежат классу (шаблону), а не инстансам.
Yandex
Объявления
30.12.2014, 16:14     ООП подмена статик функции в наследнике
Ответ Создать тему
Опции темы

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