Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.10.05;
Скачать: [xml.tar.bz2];

Вниз

Я Написал Книжку по Делфи, хотел бы узнать Ваше мнение и отзывы   Найти похожие ветки 

 
й   (2014-02-27 11:45) [280]

> Полиморфизм, с моей точки зрения, это...

вот зачем выдумывать свои определения для общепринятых ТЕРМИНОВ
да еще и настаивать на них?
хотя, иногда кажется, что процент ТЕРМИНОЛОГИЧЕСКИХ споров в интернете приближается к 80%, т.е. без них просто поговорить не о чем


 
не жена   (2014-02-27 11:46) [281]

Читаем внимательно еще раз 264.

читай внимательно сам пример с бмв у которой виртуальный переопределенный стартэнджин выключает мотор.


 
Внук ©   (2014-02-27 11:50) [282]

>>не жена   (27.02.14 11:44) [279]
Посты 249, 255, 257, 258 (пример с Васей) и далее.
Если ты, вклинившись в разговор, не понял, о чем речь, может лучше признать сразу было?

Ну, раз ты решил, что не в тему, то конечно...


 
Внук ©   (2014-02-27 11:51) [283]

>> й   (27.02.14 11:45) [280]
Потому что я не вижу тут общепринятого термина, наверно :)


 
имя   (2014-02-27 11:52) [284]

Удалено модератором


 
vuk ©   (2014-02-27 11:55) [285]

to не жена   (27.02.14 11:52) [284]:

> и никаких явных языковых средств пометить код как полиморфный
> - их просто нет.

В модели Delphi, реализующей полиморфизм через наследование таки есть. Это пометка метода virtual.


 
Внук ©   (2014-02-27 11:56) [286]

Хамить в постах - это, как известно, +20 к убедительности :)


 
не жена   (2014-02-27 11:58) [287]

виртуал он и ест виртуал.

он virtual а не полиморф.

ну и все же!
что там с моей бэхой-то?

виртуальность есть во всей красе.
а где там полиморфичность?

пальцем можете показать?

И как мне полиморфно завести мотор у нее и у ауди?


 
имя   (2014-02-27 11:59) [288]

Удалено модератором


 
Внук ©   (2014-02-27 12:02) [289]

Удалено модератором


 
ТНЕ картман   (2014-02-27 12:09) [290]

Надеюсь, бороды-то хоть у вас есть, господа спорщики?


 
И.Я. Блямблин   (2014-02-27 12:16) [291]

type
 IFoo = interface
   procedure DoIt;
 end;

 TFoo1 = class(TInterfacedObject, IFoo)
 protected
   procedure DoIt;
 end;

 TFoo2 = class(TInterfacedObject, IFoo)
 protected
   procedure DoIt;
 end;

 TBar = class(TInterfacedObject, IFoo)
 private
   FFoo: IFoo;
 protected
   property Foo: IFoo read FFoo implements IFoo;
 public
   constructor Create(Foo: IFoo);
 end;

{ TFoo1 }

procedure TFoo1.DoIt;
begin
 writeln("I do");
end;

{ TFoo2 }

procedure TFoo2.DoIt;
begin
 writeln("I do, I do");
end;

{ TBar }

constructor TBar.Create;
begin
 FFoo := Foo;
end;

var
 Foo: IFoo;

begin
 Foo := TBar.Create(TFoo1.Create);
 Foo.DoIt;
 Foo := TBar.Create(TFoo2.Create);
 Foo.DoIt;
end.


Где тут virtual в этом странном коде? Таки полиморфизм есть, а IFoo - просто группа методов, но никоим образом не общий предок.


 
vuk ©   (2014-02-27 12:19) [292]

to И.Я. Блямблин   (27.02.14 12:16) [291]:

> Таки полиморфизм есть

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


 
Внук ©   (2014-02-27 12:23) [293]

>>vuk ©   (27.02.14 12:19) [292]
 Учитывая, что интерфейс - это набор виртуальных абстрактных методов, может, способ не сильно и другой? :)


 
vuk ©   (2014-02-27 12:25) [294]

to Внук ©   (27.02.14 12:23) [293]:

>  Учитывая, что интерфейс - это набор виртуальных абстрактных
> методов, может, способ не сильно и другой? :)

Это в C++, но у нас-то не оно, не так ли? :)


 
Внук ©   (2014-02-27 12:39) [295]

>>vuk ©   (27.02.14 12:25) [294]
Ну да, я согласен, это уже реализация.

А по факту - два приема используется. Либо виртуальные методы,
либо каким-нибудь способом добровольно (по конвенции) или принудительно (через интерфейсы) прийти к реализации в разных класса методов с одинаковой сигнатурой. Или, еще лучше - и с одинаковыми именами. Вот странно такое называть полиморфизмом. Это плагинщина, как сказал ЮЗ. Против которой ничего не имею, конечно.


 
И.Я. Блямблин   (2014-02-27 12:41) [296]


>  Учитывая, что интерфейс - это набор виртуальных абстрактных
> методов, может, способ не сильно и другой? :)

За виртуальность можно и поспорить, но не суть. Для полиморфизма нужен контракт, роль которого у интерфейса здесь. То бишь, коли контракт объявлен, явно аль неявно, то Петя и Ваня пишут свои объекты, а Василь Иваныч их берет и себе вставляет без проблем.


 
vuk ©   (2014-02-27 12:44) [297]

to Внук ©   (27.02.14 12:39) [295]:

> Это плагинщина, как сказал ЮЗ.

Которая тоже есть способ реализации полиморфизма, как уже сказал я. :)


 
Внук ©   (2014-02-27 12:51) [298]

Контракты объявляются на каждом шагу. Вот я написал процедуру Dummy, тебе, чтобы вызвать, надо знать ее имя и параметры. Уже контракт. Любой заголовок функции или процедуры - контракт. Формат exe-файла - контракт. Разрядность процессора - контракт. Чего-то дохрена полиморфизма. Зачем умное слово пихать туда, где и без него все хорошо? Я ведь только об этом


 
icWasya ©   (2014-02-27 12:52) [299]

>И как мне полиморфно завести мотор у нее и у ауди?

В Вашем случае можно привести такую аналогию.
Допустим BMW выпускает несколько моделей автомобилей, с одинаковым кузовом, но с разной начинкой под капотом.
Ты садишься в машину и совершаешь привычные действия - вставить ключ в замок зажикания, отпустить ручник, включить передачу, и т.д.

То есть интерфейс водитель-машина всегда один и тот же, а внутри могут быть совершенно разные машины. Разные двигатели, наличие/отсутствие антиблокировки(и чего ещё можно придумать). Конечно во время движения разница в поведении будет заметна, но крутить нужно будет тот же руль, нажимать на те же педали и т.п.

Еще более сильнная аналогия - машина на радиоуправлении.
Тогда вообще один и тот же пульт может использоваться для разных машин.


 
Внук ©   (2014-02-27 12:58) [300]

Отвлекаясь... Была такая забавная история, когда я читал про C#. Зацепился за то, что не вижу разницы между ключевыми словами event и delegate. То есть, про то, как использовать одно, и как - другое, было дофига написано, а в чем разница - ну нет ее и все. И никто мне объяснить это не мог, зато употребляли много умных слов. А ведь те, кто писал компилятор, наверно, не мазохисты, чтобы лишнее ключевое слово просто так вводить? Ну, в итоге разница нашлась... Я к чему это. Вот этот разговор про полиморфизм напоминает ту ситуацию. Умное слово придумали, а зачем - забыли.


 
vuk ©   (2014-02-27 13:03) [301]

to Внук ©   (27.02.14 12:51) [298]:

> Чего-то дохрена полиморфизма.

Естественно, его до хрена. Особенно, если исходить из определения, что полиморфизм - не более, чем способ одновременно и единообразно работать с разнородными объектами. Другое дело, что как только мы ограничиваемся ООП, то получаем его отдельные виды - от виртуальности/наследования до duck typing.


 
И.Я. Блямблин   (2014-02-27 13:05) [302]

Все дело в том, что требование наличия общего предка не является обязательным для ООП и полиморфизма в частности.


 
И.Я. Блямблин   (2014-02-27 13:08) [303]


> Была такая забавная история, когда я читал про C#. Зацепился
> за то, что не вижу разницы между ключевыми словами event
> и delegate. То есть, про то, как использовать одно, и как
> - другое, было дофига написано, а в чем разница - ну нет
> ее и все.

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


 
big_djo ©   (2014-02-27 13:10) [304]

читаю ветку и понимаю, что и в среде мегапрограммеров нет единого взгляда что же такое полиморфизм)
кто прав -то?))


 
Внук ©   (2014-02-27 13:17) [305]

>>big_djo ©   (27.02.14 13:10) [304]
Ну я, собственно, почему и спорю до сих пор. Потому что с позиции преподавателя. Если студентам говорить про полиморфизм (надо, конечно), то про тот, который вкупе с наследованием и виртуальностью. Как одна из важных черт ООП.
Потому что то, что можно методы называть одинаково (и даже EXE-файлы в разных папках можно все называть исключительно Project1.exe - вот где полиморфизма-то полные штаны) - это и так понятно.


 
И.Я. Блямблин   (2014-02-27 13:25) [306]


> Ну я, собственно, почему и спорю до сих пор. Потому что
> с позиции преподавателя. Если студентам говорить про полиморфизм
> (надо, конечно), то про тот, который вкупе с наследованием
> и виртуальностью. Как одна из важных черт ООП. Потому что
> то, что можно методы называть одинаково (и даже EXE-файлы
> в разных папках можно все называть исключительно Project1.
> exe - вот где полиморфизма-то полные штаны) - это и так
> понятно.

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


 
Внук ©   (2014-02-27 13:29) [307]

>>И.Я. Блямблин   (27.02.14 13:25) [306]
 Есть дженерики, есть RTTI, этот самый dependency injection, не к ночи будь помянут, все понятно. Кстати, вот почему дженерики? Со времен MFC это называлось шаблоны (templates), или нет?


 
DVM ©   (2014-02-27 13:48) [308]


> Внук ©   (27.02.14 13:29) [307]


> Кстати, вот почему дженерики? Со времен MFC это называлось
> шаблоны (templates), или нет?

Насколько мне известно дженерики и шаблоны это не одно и тоже. Есть отличия в возможностях и реализации (там c#, но для Delphi тоже справедливо):

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx


 
И.Я. Блямблин   (2014-02-27 13:55) [309]


> Кстати, вот почему дженерики? Со времен MFC это называлось
> шаблоны (templates), или нет?

Шаблоны используют утиную типизацию, и это именно шаблоны кода, понятие просто ширшее.
http://blogs.teamb.com/craigstuntz/2009/10/01/38465/


 
Внук ©   (2014-02-27 14:06) [310]

Ага, спасибо


 
й   (2014-02-27 14:07) [311]

"generics" - от "generic programming" (обобщенного программирования), так изначально обозвали саму идею одного описания алгоритма для нескольких реализаций под разные типы данных
и первую _реализацию_ этой идеи - в Аде - так и назвали - generics

сиплюсплюсники, возможно, назвали свою реализацию "templates", т.к.
1) на уже имевшихся у них сишных макросах тоже можно реализовать generic programming
2) templates можно применять далеко не только в целях generic programming (turing completeness же)

остальные пошли по дорожке Ады


 
clickmaker ©   (2014-02-27 14:22) [312]

> остальные пошли по дорожке Ады

Road to Hell


 
big_djo ©   (2014-02-27 14:24) [313]

type
T1 = class
 procedure Test(I: Integer); overload;
 end;

type
T2 = class(T1)
 procedure Test(S: string); overload;
end;

Здесь в классе T2 метод Test перекрывает старый или  нет? Получается что перегрузка как -бы отменяет перекрытие так?
или всё-же надо говорить, что новый метод с другой сигнатурой перекрыввет старый, но виден в новом классе благодаря перегрузке.

как правильно будет?


 
asail ©   (2014-02-27 14:27) [314]


> ООП - это полиморфизм, наследование и инкапсуляция. Полиморфизм
> может достигаться через наследование, но есть и другие пути,
>  разные виды полиморфизма

Вставлю и свои 5 копеек... :)
Мое мнение - способов реализации полиморфизма туева хуча, но приминительно к парадигме ООП, я знаю их всего два: через наследование и через интерфейсы.
Все остальные способы реализации к ООП отношения не имеют. ИМХО.


 
asail ©   (2014-02-27 14:29) [315]


> Здесь в классе T2 метод Test перекрывает старый или  нет?

Нет. Добавляет новый, не отменяя старого. Т.е. в Т2 будут доступны оба метода, а в Т1 - один. Тут никакого полиморфизму нету...


 
vuk ©   (2014-02-27 14:34) [316]


> Мое мнение - способов реализации полиморфизма туева хуча,
>  но приминительно к парадигме ООП, я знаю их всего два:
> через наследование и через интерфейсы.Все остальные способы
> реализации к ООП отношения не имеют. ИМХО.

Повторю пример с vbscript. Классы есть, объекты есть, полиморфизм есть, наследования нет, интерфейсов нет:

> class TestClass1
>   sub Test
>     WScript.Echo "TestClass1.Test"
>   end sub
> end class
>
> class TestClass2
>   sub Test
>     WScript.Echo "TestClass2.Test"
>   end sub
> end class
>
> sub TestCall(Instance)
>   Instance.Test
> end sub
>
> dim c1, c2
>
> set c1 = new TestClass1
>
> set c2 = new TestClass2
>
> TestCall(c1)
> TestCall(c2)


 
ТНЕ картман   (2014-02-27 14:39) [317]

Чем длиннее ветка, тем меньше понимаю, о чем спорят))


 
big_djo ©   (2014-02-27 14:39) [318]

-->Нет. Добавляет новый, не отменяя старого. Т.е. в Т2 будут доступны оба
-->метода, а в Т1 - один. Тут никакого полиморфизму нету...

понятно, я так и думал


 
big_djo ©   (2014-02-27 14:43) [319]

>>asail ©   (27.02.14 14:29) [315]

type
 T1 = class
   procedure Test(I: Integer); overload;  virtual;
  end;

 type
 T2 = class(T1)
  procedure Test(S: string); overload;
  procedure Test(I: Integer); override;
 end;

 type
 T3 = class(T2)
   procedure Test(I: Integer);override;
   end;

Не будет ли такой пример представлять собой динамический и статический полиморфизм?

просто кто -то выше писал, что использование  overload это статический вариант полиморфизма


 
asail ©   (2014-02-27 14:45) [320]


> Повторю пример с vbscript. Классы есть, объекты есть, полиморфизм
> есть, наследования нет, интерфейсов нет:

Ну, тут TestCall выступает как раз в роли интерфейса, хотя явно его так не обозвали.



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Форум: "Прочее";
Текущий архив: 2014.10.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.08 MB
Время: 0.07 c
15-1393014602
Юрий
2014-02-22 00:30
2014.10.05
С днем рождения ! 22 февраля 2014 суббота


11-1255007559
Валера
2009-10-08 17:12
2014.10.05
Шрифт size


15-1393506119
Дмитрий СС
2014-02-27 17:01
2014.10.05
День недели


15-1393178439
Jeer
2014-02-23 22:00
2014.10.05
С днем Советской армии и военно-морского флота!


15-1393088378
big_djo
2014-02-22 20:59
2014.10.05
Я Написал Книжку по Делфи, хотел бы узнать Ваше мнение и отзывы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский