Регистрация Правила Главная форума Поиск |
0
- 03.02.2015 - 10:26
|
День добрый. Возникла ситуация, когда для моего алгоритма очень пригодилась бы динамическая перегрузка методов без наследования класса, нечто вроде паттерна Стратегия, но более жесткое. Пример: Класс TCar - имеет метод Speed, который возвращает его скорость (например, 20). Я назначаю классу стратегию SFly - после чего в методе Speed возвращается большее число (35). Если я назначаю новую стратегию STurbo - у него уже Speed возвращает 50. При этом, метод Speed исходного класса Car - не меняется, это важно! Он по прежнему состоит из одной строки - return 20. То есть, стратегия должна поддерживаться средствами компилятора. Наследование не подходит, ибо объект создается один раз. Делать дополнительный класс TSpeed, который передается со стратегией, и возвращает нужное значение - тоже нельзя, исходный код метода Speed строго определен и не должен меняться. Примерный псевдокод. Car C = new Car() Writeln(C.Speed()) ; // Выводит 20 AssignStrategy(C,SFly) ; Writeln(C.Speed()) ; // Выводит 35 AssignStrategy(C,STurbo) ; Writeln(C.Speed()) ; // Выводит 50 AssignStrategy(C,SFly) ; Writeln(C.Speed()) ; // Выводит снова 35 ClearStrategy(C) ; Writeln(C.Speed()) ; // Выводит 20 В ObjectPascal подобного нет, рассмотрю любой язык, если он умеет это или что-то наподобие. | |
1
- 03.02.2015 - 17:20
|
Полиморфизм C# не подойдёт? https://msdn.microsoft.com/ru-ru/library/ms173152.aspx | |
2
- 03.02.2015 - 21:29
|
практически любой динамический язык позволяет такое (питон, жабаскрипт) из статических такое можно изобразить в java * используя AOP * играясь с байткодом * изобразив прокси (штатная штука но работает только с интерфейсами) | |
3
- 03.02.2015 - 21:30
| и да, в любом случае ты хочешь изощренно отстрелить ногу | |
4
- 04.02.2015 - 19:41
|
3-wayerr > и да, в любом случае ты хочешь изощренно отстрелить ногу Само собой, это извращение. Но нужно для дела. AOP - это http://en.wikipedia.org/wiki/Aspect-...d_programming? Спасибо, почитаю. | |
5
- 04.02.2015 - 23:01
|
>Само собой, это извращение. Но нужно для дела. такое бывает нужно лишь когда есть скомпилированная баблиотека которую надо "хакнуть", во всех остальных случах использования можно избежать >AOP - это да, читать там особо нечего, это тухнология для "массового перекрытия" методов по произвольным критериям (гдето по режекспам), вот пример: http://www.mkyong.com/spring/spring-...amples-advice/ (раздел 4. Around advice) | |
6
- 05.02.2015 - 09:21
|
5-wayerr > во всех остальных случах использования можно избежать Но не тогда, когда работаешь над магистерским дипломом :-) там требования заданы жестко на уровне кафедры. Вот и ищу способы обойти. | |
7
- 05.02.2015 - 22:32
| а если этот класс TCar задекорировать, а там уже реализовать хоть стратегию хоть что? | |
8
- 06.02.2015 - 00:10
|
6-NTFS_ > Что это за требования такие? Рекомендую переосмыслить ваш алгоритм, наверняка есть способы проще и элегантнее решения поставленной задачи. А то ведь за деяния воздастся! =) | |
9
- 06.02.2015 - 13:56
| 8-40KHYTbIU >автор же писал что это требования к магистерскому диплому. Так что там может быть всякое ) | |
10
- 06.02.2015 - 14:18
| 9-ipp > Меня интересуют конкретные ограничения. Так как автор сперва сказал что хорошо бы иметь такую возможность для его "алгоритма", а потом какие не понятные ограничения всплывают. Надо прояснить вопрос. У меня есть уверенность, что решить вопрос можно иначе. | |
11
- 06.02.2015 - 15:46
|
Задача: изучение технологий расширений функций класса без использования наследования и изменения исходного кода. Язык программирования: любой. То есть, всего-то выглядит так - есть метод, нужно, чтобы над объектом сделать сильное колдунство, после чего этот метод будет работать иначе - и чтобы это изменение было обратимым. В цивилизованных случаях, это решается паттерном Стратегия или Прокси, как уже говорилось выше. Но случай нецивилизованный - код менять нельзя, создавать наследника нельзя. | |
12
- 06.02.2015 - 20:08
| Бггг! Великий и могучий С++ - переписывай виртуальную таблицу на лету. :) | |
13
- 07.02.2015 - 01:12
|
11-NTFS_ > Задача: изучение технологий расширений функций класса без использования наследования и изменения исходного кода. жабаскрит лучше всего, там прототипирование вместо наследования 8) | |
14
- 07.02.2015 - 01:14
| ну или простой прокси на java решается https://docs.oracle.com/javase/8/doc...ect/Proxy.html - стандартными средствами без всякого колдунства | |
15
- 07.02.2015 - 10:58
| Код: public class Car ** public Double speed()** return 100D; ** ** class App ** public static void main(String[] args) ** Car carOne = new Car(); Car carTwo = new Car() ** public Double speed()** return 200D; ** **; System.out.println("Speed of CarOne:"+carOne.speed()); System.out.println("Speed of CarTwo:"+carTwo.speed()); ** ** Speed of CarOne:100.0 Speed of CarTwo:200.0 Так нормально? | |
16
- 07.02.2015 - 11:52
| Я кстати предложил реальный вариант. | |
17
- 07.02.2015 - 22:24
|
Спасибо всем ответившим, как выяснилось, задание было неверно понято :-) никаких ограничений нет, можно делать одним из моих любимых паттернов, без опускания до уровня VMT и прочей чертовщины :-) Повторный опрос клиента - это магия :-) | |
| Интернет-форум Краснодарского края и Краснодара |