|
|
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Данный код выводит: Receiver Child outMe-AdvancedReceiver Пожалуста, объясните начинающему, почему в первой строке Receiver а в 3-й outMe-AdvancedReceiver? Почему вызов с параметром приходиться отрабатывать родителю? Но если определить advancedReceiver как AdvancedReceiver, тогда все как и ожидается - AdvancedReceiver Child outMe-AdvancedReceiver. public class InhTest { public static void main(String[] args) { //Parent child = new Child(); Child child = new Child(); Receiver advancedReceiver = new AdvancedReceiver(); //AdvancedReceiver advancedReceiver = new AdvancedReceiver(); advancedReceiver.receive(child); advancedReceiver.outMe(); } } class Parent { public void outMe() {System.out.println("Parent");} } class Child extends Parent { public void outMe() {System.out.println("Child");} } class Receiver { public void receive(Parent p) { System.out.println("Receiver"); p.outMe(); } public void outMe() {System.out.println("outMe-Receiver");} } class AdvancedReceiver extends Receiver{ public void receive(Child c) { System.out.println("AdvancedReceiver"); c.outMe(); } public void outMe() {System.out.println("outMe-AdvancedReceiver");} } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2012, 23:44:54 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Методы receive(Parent) receive(Сhild) имеют разную сигнатуру и не могут переопределять друг друга. Полиморфизм в такиз случаях можно огранизовать на генериках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2012, 23:50:47 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Вижу мене не поняли. Вот другой пример. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Плюс поиграться с 17 и 18 строкой, а потом подумать почему именно это выводиться на печать. Судя по всему ясное представление есть не у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 13:38:23 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Gelo_RВижу мене не поняли. Ну, так стоит научиться подсветку использовать и мысли ясно излагать. Gelo_RПлюс поиграться с 17 и 18 строкой, а потом подумать почему именно это выводиться на печать. Кому подумать? Мне тут всё очевидно. Играйтесь на здоровье. Gelo_RСудя по всему ясное представление есть не у всех. По чему "по всему" и у кого "не у всех". Кроме нас с вами в этой теме никто не отметился. Для меня тут всё понятно. Выходит не ясное представление у вас. Так что именно не понятно? Давайте объясню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 14:05:31 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Извините уважаемый Blazkowicz. Ничем не хотел ВАС задеть, и тем более не высказывался именно в ваш адрес. Пожалуста не кипятитесь. Этот пример был взят на хабре, бурно обсуждался, но объяснение так и не было озвучено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 14:41:31 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Gelo_RЭтот пример был взят на хабре, бурно обсуждался, но объяснение так и не было озвучено. На хабре средний уровень программистов ниже плинтуса. Многие статьи и обсуждения пишутся новичками с опытом в 1-2 года. Вы задайте конкретый вопрос, что именно из второго примера у вас вызывает непонимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 14:47:57 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Как-то некрасиво, выходит можно слегка нарушить инкапсуляцию? Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 15:10:34 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Спасибо. Но после нескольких часов втыкания, кажется уже сам допер что к чему. С объектом можно работать именно в том интерфейсе, который обеспечивает тип этой переменной. Number n=new Float(1); - n хотя и хранит float, но интерфейс предоставляет только как Number. Поэтому void print(Float f){System.out.println("Child F");} из ChildBase никогда не выполниться, потому что предполагается, что мы будем использовать параметр f как float, а у нас - Number. И в 19 строке o.print(1); печатает Base N, потому что совсем не видит этот метод в ChildBase. кажется так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 15:11:07 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Gelo_Rкажется так. Вам стоит разобраться в том как работают виртуальные вызовы на низком уровне http://ru.wikipedia.org/wiki/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2 Вообще здесь речь не о полиморфизме, а конкретно о виртуальных методах. Компилятор связывает вызов только с типом переменной. Потому что никакой другой информации о возможных наследниках у компилятора на данном этапе нет. При вызове же виртуального метода, рантайм уже смотрит, а нет ли в иерархии у вызываемого метода переопределений. И вызывает метод потомка с такой же сигнатурой, если таковой имеется. Когда этот механизим будет понятен, то и вопросы с переопределением прояснятся. Правда в Java есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 15:18:28 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
А что можно почитать именно по этому: Правда в Java есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода.? И еще, не по теме. Может подскажете что почитать по шаблонам проектирования? А то скачал пару книг. Голая заумная теория и непонятно чем один патерн отличается от другого, например фактори от билдера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 16:01:48 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Gelo_RА что можно почитать именно по этому: Используйте инструменты форума. Нихрена не ясно где ваш текст, а что вы цитируете. http://rsdn.ru/forum/java/472058.aspx http://docs.oracle.com/javase/tutorial/java/IandI/override.html An overriding method can also return a subtype of the type returned by the overridden method. This is called a covariant return type. Gelo_RМожет подскажете что почитать по шаблонам проектирования? А то скачал пару книг. Голая заумная теория и непонятно чем один патерн отличается от другого, например фактори от билдера. GoF - подробная и простая книга. Только важно понимать, что она не является руководством к действию. Её нужно читать как учебник с разбором примеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 16:14:02 |
|
||
|
Что нужно знать о полиморфизме?
|
|||
|---|---|---|---|
|
#18+
Gelo_RА что можно почитать именно по этому: Правда в Java есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода.? И еще, не по теме. Может подскажете что почитать по шаблонам проектирования? А то скачал пару книг. Голая заумная теория и непонятно чем один патерн отличается от другого, например фактори от билдера. по переопределению, перегрузке и связыванию есть хорошая и понятная статья: http://skipy.ru/technics/over.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2012, 16:15:06 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=279&tid=2131374]: |
0ms |
get settings: |
10ms |
get forum list: |
38ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
36ms |
get topic data: |
17ms |
get forum data: |
5ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 307ms |
| total: | 493ms |

| 0 / 0 |
