Форум: "Прочее";
Текущий архив: 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