Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.10.05;
Скачать: CL | DM;

Вниз

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

 
й   (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;
Скачать: CL | DM;

Наверх




Память: 1.09 MB
Время: 0.087 c
8-1235415285
Кошкин
2009-02-23 21:54
2014.10.05
Модель в редакторе и в программе


8-1234686127
Зашибис
2009-02-15 11:22
2014.10.05
Потоковое видео с IP-камеры AVIOSYS 9060A-MP на форме D6


15-1393662306
Demo
2014-03-01 12:25
2014.10.05
SQl import


15-1374125573
megavoid
2013-07-18 09:32
2014.10.05
Меня забанил Microsoft CDN?


15-1393012843
Михаил
2014-02-22 00:00
2014.10.05
генирация RTF документов