powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что нужно знать о полиморфизме?
12 сообщений из 12, страница 1 из 1
Что нужно знать о полиморфизме?
    #37875648
Gelo_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данный код выводит:
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");}
}
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37875652
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Методы
receive(Parent)
receive(Сhild)
имеют разную сигнатуру и не могут переопределять друг друга. Полиморфизм в такиз случаях можно огранизовать на генериках.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876520
Gelo_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вижу мене не поняли.
Вот другой пример.
Код: 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.
class Base{
  void print(Object o){System.out.println("Base O");}
  void print(Number n){System.out.println("Base N");}
}	

class ChildBase extends Base{
	void print(Object o){System.out.println("Child O");}
	void print(int i){System.out.println("Child I");}
	void print(Integer n){System.out.println("Child N");}
	void print(Float f){System.out.println("Child F");}
	void print(char c){System.out.println("Child C");}
}

public class Test1{
	  public static void main(String args[]){
	    Base o = new ChildBase();			//17
		//ChildBase o = new ChildBase();	//18
	    o.print(new Object());		//printed Child O
	    o.print(1);				//printed Base N
	    o.print('c');				//printed Child O
	    o.print(new Integer(1)); 	        //printed Base N 
	    Number n=new Float(1);
	    o.print(n);				//printed Base N
	  }
}



Плюс поиграться с 17 и 18 строкой, а потом подумать почему именно это выводиться на печать.
Судя по всему ясное представление есть не у всех.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gelo_RВижу мене не поняли.
Ну, так стоит научиться подсветку использовать и мысли ясно излагать.

Gelo_RПлюс поиграться с 17 и 18 строкой, а потом подумать почему именно это выводиться на печать.
Кому подумать? Мне тут всё очевидно. Играйтесь на здоровье.

Gelo_RСудя по всему ясное представление есть не у всех.
По чему "по всему" и у кого "не у всех". Кроме нас с вами в этой теме никто не отметился. Для меня тут всё понятно. Выходит не ясное представление у вас. Так что именно не понятно? Давайте объясню.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876649
Gelo_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините уважаемый Blazkowicz.
Ничем не хотел ВАС задеть, и тем более не высказывался именно в ваш адрес.
Пожалуста не кипятитесь.
Этот пример был взят на хабре, бурно обсуждался, но объяснение так и не было озвучено.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876663
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gelo_RЭтот пример был взят на хабре, бурно обсуждался, но объяснение так и не было озвучено.
На хабре средний уровень программистов ниже плинтуса. Многие статьи и обсуждения пишутся новичками с опытом в 1-2 года. Вы задайте конкретый вопрос, что именно из второго примера у вас вызывает непонимание.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876727
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Как-то некрасиво, выходит можно слегка нарушить инкапсуляцию?

Код: java
1.
2.
3.
		Receiver advancedReceiver = new AdvancedReceiver();
		advancedReceiver.receive(child);// вызывается метод Receiver
		((AdvancedReceiver)advancedReceiver).receive(child); // вызывается метод AdvancedReceiver
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876729
Gelo_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Но после нескольких часов втыкания, кажется уже сам допер что к чему.
С объектом можно работать именно в том интерфейсе, который обеспечивает тип этой переменной.
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.

кажется так.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876754
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876869
Gelo_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что можно почитать именно по этому:
Правда в Java есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода.?

И еще, не по теме.
Может подскажете что почитать по шаблонам проектирования? А то скачал пару книг. Голая заумная теория и непонятно чем один патерн отличается от другого, например фактори от билдера.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876892
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - подробная и простая книга. Только важно понимать, что она не является руководством к действию. Её нужно читать как учебник с разбором примеров.
...
Рейтинг: 0 / 0
Что нужно знать о полиморфизме?
    #37876895
vie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gelo_RА что можно почитать именно по этому:
Правда в Java есть и другие тонкости - возможность замены возвращаемого типа и выбор наиболее специфичного метода.?

И еще, не по теме.
Может подскажете что почитать по шаблонам проектирования? А то скачал пару книг. Голая заумная теория и непонятно чем один патерн отличается от другого, например фактори от билдера.

по переопределению, перегрузке и связыванию есть хорошая и понятная статья: http://skipy.ru/technics/over.html
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Что нужно знать о полиморфизме?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]