Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Просмотр темы
 Распечатать тему
Парадигмы ООП
mike
#1 Распечатать сообщение
Опубликовано 23.10.2009 17:55:34
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

vanka написал:
Прошу тогда дать мне ссылку на "правильное" определение полиморфизма. Описанный в данной статье полиморфизм (на самом деле перегрузка) есть и в с++ без единого класса.


Вряд ли такая ссылка существует.

Понимание/трактование принципов и определений ООП будет там "правильнее" чем эффективнее такое понимание позволяет эти самые принципы использовать. И вообще, считаю что ООП для человека это просто способ научиться думать на другом языке, более близком к современным компиляторам.

Полиморфизм в общем случае никак не связан с классами. В статье это не утверждается.
Только в C# у каждого метода должен быть декларирующий класс. В С++ этого нет. Вот и вся разница.

Перегрузка методов - частный случай полиморфизма. Контекст выполнения тут зависит от типа принимаемого аргумента у вызываемой функции.

Вот еще один случай полиморфизма - см. метод ToString() у класса System.Object.
Любой код, вызывающий ToString() у экземпляра какого-либо класса будет полиморфным.
Контекст выполнения тут зависит от типа экземпляра.
 
vanka
#2 Распечатать сообщение
Опубликовано 23.10.2009 18:21:36
Аватар пользователя

Администратор


Сообщений: 532
Зарегистрирован: 03.03.09


Вряд ли такая ссылка существует.

Как тогда можно утверждать, что в википедии неверно?

Я вообще согласен, что полиморфизм в общем случае может к классам и не относиться, но полиморфизм с точки зрения ООП (полиморфизм упомянался в статье как фича ООП) это именно то, что описано в википедии.

Приведу хоть какие-то ссылки:
Полифорфизм в ООП (именно это обычно и называют полиморфизмом)
http://en.wikiped...rogramming
Полиморфизм типов:
http://en.wikiped...lymorphism
 
mike
#3 Распечатать сообщение
Опубликовано 23.10.2009 18:57:38
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Согласен, погорячился. Явление полиморфизма действительно можно наблюдать при использовании наследования. (тот же ToString()). Значит связь между этими принципами есть. Хоть и косвенная - они вполне могут существовать друг без друга. А в вики просто не полностью сказано на эту тему. Нет ничего про перегрузку. На 100% убежден - перегрузка тоже полиморфизм. По этому нужно было сказать что в вики не заблуждаются а просто не достаточно точны...

Ссылки которые ты привел я посмотрел.
Согласен что "это обычно и называют полиморфизмом".

Однако мне так и не понятна твоя точка зрения что перегрузка это совсем другое...
 
vanka
#4 Распечатать сообщение
Опубликовано 23.10.2009 19:23:05
Аватар пользователя

Администратор


Сообщений: 532
Зарегистрирован: 03.03.09

В терминологии вики перегрузка - это полиморфизм ТИПОВ.

Моя точка зрения состоит в том, что перегрузка не связана с понятием полиморфизма в ООП (по крайней мере в общепринятом понимании этого понятия), так что может возникнуть недопонимание у читателя.

А про ToString() я не очень понял Smile. Если его переопределить в потомке, то получится полиморфизм, это да. Но если не переопределять, то полиморфизма и не будет.

Я просто не понимаю, какой смысл связывать перегрузку и полиморфизм в ООП. Перегрузка делается и без свякого ООП (например в с++).
 
pax
#5 Распечатать сообщение
Опубликовано 23.10.2009 19:47:36
Аватар пользователя

Ветеран


Сообщений: 571
Зарегистрирован: 27.03.09

Всегда думал, что полиморфизм значит различное поведение одних и тех же методов, с одинаковыми параметрами, но с разной реализацией в дочерних классах. По моему самый яркий пример в XNA - GameComponent.
Не удержать тебя,
Тебе не объяснить,
Что ненавидеть слишком просто,
Трудней любить такую жизнь. © Кипелов - Наважденье
 
http://shgames.ru/
mike
#6 Распечатать сообщение
Опубликовано 24.10.2009 14:13:17
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Разница тут лишь в том, что "классический" полиморфизм использует механизм динамического (или позднего) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции при перегрузке методов и операторов.

Перегрузка это полиморфизм времени компиляции.

Потому, что итог в обоих случаях один - получаем полиморфный ("многогранный"Wink код.
 
Chaos_Optima
#7 Распечатать сообщение
Опубликовано 25.10.2009 02:08:45
Аватар пользователя

Старший специалист


Сообщений: 310
Зарегистрирован: 16.04.09

полиморфизм это возможность использовать один и тотже клас по разному
обязательными признаками полиморфизма являются:
-наследование
-перезапись методов (не перегрузка!!)
а перегрузка это действительно полиморфизм ТИПОВ
тоесть в 1 типе одну и туже функцию можно использовать по разному в зависимости от передоваемых параметров
примеры:
есть полиморфизм
Загрузить источник  GeSHi: C#
  1. class tmp1
  2. {
  3. virtual void myFunk(int c)
  4. {
  5. c++;
  6. }
  7. }
  8.  
  9. class tmp2:public tmp1
  10. {
  11. override void myFunk(int c)
  12. {
  13. c--;
  14. }
  15. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2

нет полиморфизма
Загрузить источник  GeSHi: C#
  1. class tmp1
  2. {
  3. void myFunk(string c)
  4. {
  5. c="No polimorf";
  6. }
  7.  
  8. }
  9.  
  10. class tmp2:public tmp1
  11. {
  12. void myFunk(int c)
  13. {
  14. c++;
  15. }
  16. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2

почему нету? потомучто
Загрузить источник  GeSHi: C#
  1.  
  2. void test(tmp1 lala)
  3. {
  4. int i;
  5. lala.myFunk(i);
  6. }
  7.  
  8. void main()
  9. {
  10. tmp2 lala;
  11. test(lala);
  12. }
  13.  
Добавлено за 0.004 секунд, используя GeSHi 1.0.8.2

в первом случае будет работать
во втором нет, а значить, опираясь на определение, перегрузка не является случаем полиморфизма
Изменил(а) Chaos_Optima, 25.10.2009 02:14:51
 
mike
#8 Распечатать сообщение
Опубликовано 25.10.2009 03:07:20
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Ваши примеры демонстрируют полиморфизм времени исполнения.

Исходя из обозначенных признаков "настоящего полиморфизма", делаю вывод что, полиморфизм невозможен без наследования.
(раз последнее является обязательным признаком первого)

Почему тогда полиморфизм не выражен в виде частного случая наследования?

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

Тогда, как уже было отмечено, ООП это просто мост между ментальной деятельностью человеческого мозга и скудным скрипом процесса порождающихся байтов полученных от работы компилятора.

Что собственно и требовалось доказать -
Понимание принципов ООП будет тем "правильнее" чем эффективнее такое понимание позволяет эти самые принципы использовать.
 
pax
#9 Распечатать сообщение
Опубликовано 25.10.2009 08:24:59
Аватар пользователя

Ветеран


Сообщений: 571
Зарегистрирован: 27.03.09

mike написал:
Почему тогда полиморфизм не выражен в виде частного случая наследования?


Потому что наследование может быть и без полиморфизма, а полиморфизм может быть и без наследования, например с использованием интерфейсов Wink
Не удержать тебя,
Тебе не объяснить,
Что ненавидеть слишком просто,
Трудней любить такую жизнь. © Кипелов - Наважденье
 
http://shgames.ru/
Chaos_Optima
#10 Распечатать сообщение
Опубликовано 25.10.2009 10:43:58
Аватар пользователя

Старший специалист


Сообщений: 310
Зарегистрирован: 16.04.09

PAX
ну вобщет использование интерфейсов это тоже наследование
такчто для полиморфизма наследование это обязательное условие
Почему тогда полиморфизм не выражен в виде частного случая наследования?
потомучто наследование может быть и без полиморфизма
и везде где ты упоминал ToString это да это полиморфизм только там используется не перегрузка а перезапись метода!!!
"полиморфизм" и "полиморфизм ТИПОВ" это мягко говоря неразделимые вещи
ещё как разделимые полиморфизм типов это перегрузка и он не обязан выполнять 1 условие полиморфизма и невыполняет вобще 2 условие, тоесть необязательно наследоватся и темболее перезаписывать метод
 
mike
#11 Распечатать сообщение
Опубликовано 25.10.2009 13:07:30
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Боюсь, уважаемые коллеги, вы говорите об одном и том же явлении ))

Разница тут лишь в том, что один полиморфизм использует механизм динамического (или позднего) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции при полиморфизме №2
 
pax
#12 Распечатать сообщение
Опубликовано 25.10.2009 15:48:39
Аватар пользователя

Ветеран


Сообщений: 571
Зарегистрирован: 27.03.09

Chaos_Optima написал:
PAX
ну вобщет использование интерфейсов это тоже наследование
такчто для полиморфизма наследование это обязательное условие

Ну да, сказал, а подумал после... Smile
Не удержать тебя,
Тебе не объяснить,
Что ненавидеть слишком просто,
Трудней любить такую жизнь. © Кипелов - Наважденье
 
http://shgames.ru/
Chaos_Optima
#13 Распечатать сообщение
Опубликовано 26.10.2009 00:19:45
Аватар пользователя

Старший специалист


Сообщений: 310
Зарегистрирован: 16.04.09

Разница тут лишь в том, что один полиморфизм использует механизм динамического (или позднего) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции при полиморфизме №2
а что вы понимаете под динамическим связыванием полиморфизма и статическим?
 
mike
#14 Распечатать сообщение
Опубликовано 26.10.2009 00:43:30
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Первое в рантайме происходит, второе во время компиляции.
 
Chaos_Optima
#15 Распечатать сообщение
Опубликовано 26.10.2009 09:16:26
Аватар пользователя

Старший специалист


Сообщений: 310
Зарегистрирован: 16.04.09

а как это в рантайме если всё это уже предписано в программе?
тоесть в рантайме изменяется код программы ? както я себе это не представляю
полиморфизм это возможность использовать один и тотже клас по разному
тоесть используя одну и туже функцию с одними и темеже входными параметрами мы получаем разный результат
и это осуществляется благодоря наследованию
как вы можете это делать динамически в ходе выполнения программы ведь если не будут соблюдены правила прога просто выкинет эксепшон
 
general
#16 Распечатать сообщение
Опубликовано 26.10.2009 09:31:50
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

это особенность clr, один из режимов работы, тот который по умолчанию.
Изменил(а) general, 26.10.2009 09:32:59
 
Chaos_Optima
#17 Распечатать сообщение
Опубликовано 26.10.2009 10:56:56
Аватар пользователя

Старший специалист


Сообщений: 310
Зарегистрирован: 16.04.09

нет но ведь всёравно вся логика предпописана в программе clr ведь неможет изменять логику поведения
Изменил(а) Chaos_Optima, 26.10.2009 11:02:24
 
mike
#18 Распечатать сообщение
Опубликовано 26.10.2009 15:13:29
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

Раннее связывание тем и отличается от позднего, что выполняемый код становится известен во время компиляции. В отличие от позднего - код, который будет реально выполнен известен только в момент вызова виртуальной функции.

Другими словами, раннее и позднее связывание реализованы в виде использования обычных (прямых) и виртуальных вызовов.

Если посмотреть дизассемблер участка кода где есть виртуальный вызов, то сказать о том какой код будет выполнен нельзя.

А вы говорите -
всё это уже предписано в программе


 
Перейти на форум:
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,18 секунд 8,711,652 уникальных посетителей