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

Вниз

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

 
big_djo ©   (2014-02-22 20:59) [0]

Здравствуете! Недавно я опубликовал книжку для начинающих программистов "Курс практического программирования в Delphi. Объектно-ориентированное программирование" в Москве в изд-ве "Солон-Пресс", был бы рад узнать Ваши мнения и отзывы


 
big_djo ©   (2014-02-22 21:03) [1]

Привожу ознакомительный вариант книжки. Приведены: Практическая работа №1 -полностью, остальные несколько работ частично.
http://yadi.sk/d/5SRgrCCTJMnwv


 
Дмитрий СС   (2014-02-22 21:31) [2]


Для обучения и освоения объектно-ориенитрованной среды программирования Delphi наиболее оптимальными версиями являются Delphi 6 или Delphi7.

Почему?

И еще в глаза бросилось: 4 скриншота по поводу сохранения проекта и ни одного в "Задание 1.1.0".

Оформление кода плохое, оформление форм - плохое (а ведь к аккуратности нужно приучать с самого начала!)

if D<0 then
begin
ShowMessage("Корней нет");
halt;// немедленное прекращение программы
end;

Зачем halt?
Я уже не говорю, что D таким образом сравнивать с нулем некорректно в общем случае.


if Drug=true then Canvas.LineTo(X,Y)

Зачем =true ?

Дальше смотреть не стал.
У меня мама изучает Delphi в данный момент (переходит с Pascal) с целью преподавания. Я бы ей вашу книгу не порекомендовал.


 
Mystic ©   (2014-02-22 21:40) [3]

Мне непонятно, кому адресована книга. Если совсем начинающим, то нужно дать основы программирования вообще. Как введение в Delphi для тех, у кого есть опыт, то слишком элементарно. Как справочник тоже не тянет.


 
clickmaker ©   (2014-02-22 21:59) [4]

TForm1.Button1Click

edit4.Text
edit5.Text

Дальше можно не читать


 
Inovet ©   (2014-02-22 22:05) [5]

Недавно была такая тема, кто помнит.


 
Inovet ©   (2014-02-22 22:19) [6]

Бросилось в глаза: "Вернитесь в режим программирования". Как-то оно не по-нашему звучит. Что за режим такой? Для начинающих тем более не надо выдумывать несуществующие режимы, как и приучать к этим, набившим оскомину Form1, Edit1 и т.д.. Наоборот надо чётко объяснять что есть что и рекомендовать заменять дефолтные имена на осмысленные, показывая заодно и это в примерах.


 
ухты   (2014-02-22 22:22) [7]


> TForm1.Button1Click
а надо было TMySuperPuperForm.MySuperPuperButtonClick ?


 
Inovet ©   (2014-02-22 22:28) [8]

> [7] ухты   (22.02.14 22:22)

Посмотри Задание 1.2.1


 
Inovet ©   (2014-02-22 22:32) [9]

> [5] Inovet ©   (22.02.14 22:05)
> Недавно была такая тема, кто помнит.

Нашёл, но её, оказывается, безжалостно выпилили не понятно за что.


 
ухты   (2014-02-22 23:32) [10]


> Посмотри Задание 1.2.1
да я тоже не в восторге от книги с самого начала, думаю критики к ней больше чем в ней заданий :)


 
big_djo ©   (2014-02-22 23:51) [11]

-->Зачем halt?
Согласен halt здесь лишний, но с другой стороны он не сильно и портит код) выпилю его в последующем переиздании

-->if Drug=true then Canvas.LineTo(X,Y)
-->Зачем =true ?

для новичка нормально так написать, пусть будет ясно что Drug сравнивается именно с true. Книжка не посвящена нюансам паскаля, паскал новички могут выучить по другим книжкам

-->Бросилось в глаза: "Вернитесь в режим программирования". Как-то
-->не по-нашему звучит. Что за режим такой?

это Режим набирания кода программистом в редакторе кода))) Это просто для упрощения

-->да я тоже не в восторге от книги с самого начала, думаю критики к
-->ней больше чем в ней заданий :)

Я нормально отношусь к конструктивной критике) буду рад замечаниям


 
big_djo ©   (2014-02-22 23:54) [12]

-->Оформление кода плохое, оформление форм - плохое
согласен, щас делаю новое переиздание код будет выделен Courier New

-->У меня мама изучает Delphi в данный момент (переходит с Pascal) с
-->целью преподавания. Я бы ей вашу книгу не порекомендовал.
я книжку протестировал многократно на студентах, за месяц они стали разбираться в Делфи очень неплохо)


 
картман ©   (2014-02-22 23:58) [13]

как стать преподом за 24 часа))


 
DVM ©   (2014-02-22 23:58) [14]


> big_djo ©   (22.02.14 23:51) [11]


> это Режим набирания кода программистом в редакторе кода)))
> Это просто для упрощения

Так и писали бы Редактор кода и Дизайнер форм. Иначе только путаница будет. Пользуйтесь устоявшейся терминологией.


 
DVM ©   (2014-02-23 00:02) [15]

Над языком, надо еще поработать. Чтоб не было таких фраз:


Таким образом, чтобы отловить любое шныряющее к вашему приложению сообщение Windows, достаточно создать свою собственную процедуру с любым именем, например, ApplicOnMessage с теми же параметрами.


 
ухты   (2014-02-23 00:06) [16]


> я книжку протестировал многократно на студентах, за месяц
> они стали разбираться в Делфи очень неплохо)
а студенты каких факультетов, вузов?


 
ухты   (2014-02-23 00:06) [17]


> я книжку протестировал многократно на студентах, за месяц
> они стали разбираться в Делфи очень неплохо)
а студенты каких факультетов, вузов?


 
big_djo ©   (2014-02-23 00:12) [18]

-->а студенты каких факультетов, вузов?
первокурсники, самых разных, негуманитарных, физики, математики , информаты


 
Дмитрий СС   (2014-02-23 00:15) [19]


> они стали разбираться в Делфи очень неплохо

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


 
big_djo ©   (2014-02-23 00:23) [20]

-->Так и писали бы Редактор кода и Дизайнер форм. Иначе только
-->путаница будет. Пользуйтесь устоявшейся терминологией.

да надо поменять будет, на типа "Далее, в редакторе кода сделайте то-то и то-то.."

-->Над языком, надо еще поработать. Чтоб не было таких фраз:
-->Таким образом, чтобы отловить любое шныряющее к вашему
-->приложению сообщение Windows, достаточно создать свою

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


 
Inovet ©   (2014-02-23 00:33) [21]

> [11] big_djo ©   (22.02.14 23:51)
> для новичка нормально так написать

Это ненормально, тем более ненормально такую ахинею в учебнике предлагать ученику.


 
Inovet ©   (2014-02-23 00:35) [22]

> [11] big_djo ©   (22.02.14 23:51)
> пусть будет ясно что Drug сравнивается именно с true

Он не сравнивается - он и есть сам. И нюансы Паскаля здесь совершенно ни при чём, потому что это не нюансы Паскаля.


 
Inovet ©   (2014-02-23 00:35) [23]

> [11] big_djo ©   (22.02.14 23:51)
> Режим набирания кода программистом в редакторе кода))) Это
> просто для упрощения

Это для запутывания и усложнения.


 
big_djo ©   (2014-02-23 00:38) [24]

-->Это ненормально, тем более ненормально такую ахинею в учебнике
-->предлагать ученику.

не согласен, это лишь мелочь которая у новичка заострит внимание с чем сравнивается переменная. выпиливать не стану)


 
big_djo ©   (2014-02-23 00:41) [25]

-->Это для запутывания и усложнения
Насколько я могу судить по сотне студентов никто НИ РАЗУ не запутался)) Выполняли всё с нуля без малейшей подсказки с моей стороны)


 
Inovet ©   (2014-02-23 00:43) [26]

> [24] big_djo ©   (23.02.14 00:38)

Да не сравнивается она, не должна сравниваться. Не надо приучать к таким глупостям, это называется - непонимание типов данных. Наоборот, надо показывать что логический тип сам участвует в условной операции. Вот на этом надо заострить внимание на примерах. А не на масло = масло.


 
Inovet ©   (2014-02-23 00:45) [27]

> [25] big_djo ©   (23.02.14 00:41)
> Насколько я могу судить по сотне студентов никто НИ РАЗУ не запутался

Стойкие студенты, но если приложить достаточно усилий, то и их можно вогнать в глубокий лес таких вот самобытных представлений.


 
big_djo ©   (2014-02-23 00:50) [28]

Для меня важнее читабельность, программа работает корректно, ничего страшного если там будет сравнение с true.

-->Стойкие студенты, но если приложить достаточно усилий, то и их
-->можно вогнать в глубокий лес таких вот самобытных представлений.

самобытного там ничего нет)


 
big_djo ©   (2014-02-23 00:52) [29]

-->Для обучения и освоения объектно-ориенитрованной среды
-->программирования Delphi наиболее оптимальными версиями являются
-->Delphi 6 или Delphi7.

-->Почему?

Потому , что Delphi 7 наименнее глючный из всех версий, насколько я мог убедиться


 
Anatoly Podgoretsky ©   (2014-02-23 00:55) [30]

Д5 безглючнее


 
Павиа   (2014-02-23 01:03) [31]

Сразу видно что книжка Русская.
Будь американская была бы благодарность и имена тестеров на 10 листов.
Всё-таки мне больше нравятся немецкие книжки. Где в первых главах даются необходимые знания, для дальнейшего освоения материала.
Что такое ООП не описано. Зачем оно нужно тоже не описано.

Да и вообще название книги не отражает её содержание.

Выбранная версия Delphi не актуальна.

По edit"ам автору следует рассказать про ошибку доступа и прочие ошибки. Которые будут при выполнении на первых уроков.

Отсутствует обработка ошибок. Хотя согласен что по началу не стоит перегружать учеников.

Также книжка учит дурному коду, а именно демонстрирует как применять глобальные переменные.


Из ошибок.
Автор путает язык Delphi с языком object Pascal.


> В Delphi стандартные оконные приложения являются потомками
> класса TWinControl и TControl, и, когда они создаются, они
> регистрируются в Windows, получая уникальный идентификатор
> – дескриптор (Handle)

Во первых Handle это не дескриптор.
Handle это указатель, ссылка.
Descriptor- описатель, это некоторая структура.
Во-вторых давать описание неизвестного термина через неизвестный это издевательство над читающим.


> Переместите на форму Label1, checkbox1, а также таймер timer1

Если переместить, то без единичек либо создать.  

Вердикт, куда не ткни везде залёты и ошибки. Так что книгу рекомендую выбросить.


 
Павиа   (2014-02-23 01:07) [32]


> Anatoly Podgoretsky ©   (23.02.14 00:55) [30]
> Д5 безглючнее

Д4 ещё более безглючнее.


 
Inovet ©   (2014-02-23 01:08) [33]

> [28] big_djo ©   (23.02.14 00:50)
> Для меня важнее читабельность, программа работает корректно,
> ничего страшного если там будет сравнение с true.

Это плохо как раз для читабельности. "Не плоди сущности без необходимости".
Видим:

if a = true then

Запинка. Так, а почему эта переменная сравнивается с true, может это на логический тип там? Сомнения. Смотрим выше на 10 страниц

var
 a : boolean;

А, ну так ламер писал, понятно что ждать дальше. Плюёмся листаем вниз на 10 страниц, ищем где там эта долбаная строчка, вспоминая проматерь всех говнокодеров.

Тогда следуя такой логике надо писать в едином стиле

if a = false then

вместо

if not a then

и

if b > c = true then

вместо

if b > c then


и т.п.


 
Palladin ©   (2014-02-23 01:13) [34]

ну нафига я это читаю...


 
clickmaker ©   (2014-02-23 01:20) [35]

явное сравнение с true/false актуально только в тех языках, где присвоение и равно обозначается одним символов. c/c++, c#, php...
Иногда сишники пишут даже что-то типа
if (false == a)
чтобы избежать случайных ошибок, да и читается лучше, чем !a


 
big_djo ©   (2014-02-23 01:50) [36]

-->Во первых Handle это не дескриптор.
-->Handle это указатель, ссылка.
-->Descriptor- описатель, это некоторая структура.
Здесь контекст текста подразумевает схожесть между терминами, дескриптор - описатель или разновидность указателя.

Привожу ссылку на текст из http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169#03

"
Каждому объекту, созданному с помощью Win API, присваивается уникальный номер (дескриптор). Конкретное значение этого дескриптора не несёт для программиста никакой полезной информации и может быть использовано только для того, чтобы при вызове функций из Win API указывать, с каким объектом требуется выполнить операцию. В большинстве случаев дескрипторы представляют собой 32-значные числа, а значит, их можно передавать везде, где требуются такие числа. В дальнейшем мы увидим, что Win API несколько вольно обращается с типами, т.е. один и тот же параметр в различных ситуациях может содержать и число, и указатель, и дескриптор, поэтому знание двоичного представления дескриптора всё-таки приносит программисту пользу (хотя если бы система Windows была "спроектирована по правилам", тип дескриптора не должен был бы интересовать программиста)."

p.s. В новой версии книжки я скорректирую этот момент и приведу более точное описание

--> if a = false then
вы используйте операцию сравнения "=" двух значений "a" и "false"  и получайте результат.

кто Вам сказал, что нельзя использовать такой вариант?
В стандарте паскаля об этом не говорится и не запрещается:
6.7.2.3 Boolean operators
Operands and results for Boolean operations shall be of

Boolean-type. The Boolean operators
or, and, and not shall denote respectively the logical

operations of disjunction, conjunction, and
negation.
Boolean-expression = expression .
A Boolean-expression shall be an expression that denotes

a value of Boolean-type.

Inovet вы сконцентировали внимание на несущественных мелочах, а конструктивной критики именно от вас ноль


 
big_djo ©   (2014-02-23 01:55) [37]

-->Также книжка учит дурному коду, а именно демонстрирует как
-->применять глобальные переменные.
По вашему про глобальные переменные им вобще не надо знать так?
Я не хочу делать книжку по паскалю, предполагается, что понятие переменных, область видимости, стандартные типы они прочитают в других книгах по паскалю


 
Inovet ©   (2014-02-23 02:01) [38]

> [35] clickmaker ©   (23.02.14 01:20)
> if (false == a)

Pачем такое? Другое дело написать
if(a = 3)
вместо
if(a == 3)
но и тут предупреждение будет, но на всякий случай можно
if(3 == a)
если там вдруг окажется внезапно
if(3 = a)
так и фиг с ним, такое - уже ошибка времени компиляции. Ну а если шибко хочется присвоить и тут же сравнить, так что тут уже поделаешь, можно влететь, но кто заставлял
if(d == (a = b + c))


 
Германн ©   (2014-02-23 02:06) [39]


> big_djo ©   (22.02.14 20:59)
>
> Здравствуете! Недавно я опубликовал книжку для начинающих
> программистов "Курс практического программирования в Delphi.
>  Объектно-ориентированное программирование" в Москве в изд-
> ве "Солон-Пресс", был бы рад узнать Ваши мнения и отзывы

Я не сторонник зелёных, но в данном случае мне деревья жалко. Даже если пострадает только несколько веток. Ибо эта книга не стоит той бумаги, на которой она напечатана.


 
Inovet ©   (2014-02-23 02:10) [40]

> [36] big_djo ©   (23.02.14 01:50)
> кто Вам сказал, что нельзя использовать такой вариант?
> В стандарте паскаля об этом не говорится и не запрещается:

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

> [36] big_djo ©   (23.02.14 01:50)
> Inovet вы сконцентировали внимание на несущественных мелочах,
> а конструктивной критики именно от вас ноль

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


 
big_djo ©   (2014-02-23 02:19) [41]

-->В книжке куда не ткни везде такие ляпы, но для Вас это
-->несущественные мелочи. Но Вы, заметим, пытаетесь нести свет знания
-->и навыков в массы, так могут ли при этом мелочи быть
-->несущественными.

Пока недостатки следующие:
1) Оформление кода и рисунков
2) мои вольности типа "Режим программирования" вместо "Редактор кода" или "шныряющее сообщение "
3) лишний halt, который выпилю
4) Некоторое неточное определение handle, на которое я дал пояснение, ссылкой

P.S. Недостатки буду фиксить в новом переиздании.


 
big_djo ©   (2014-02-23 02:23) [42]

--> Выбранная версия Delphi не актуальна.
А это уже чушь... Учиться можно почти по любой версии


 
Германн ©   (2014-02-23 02:56) [43]


> P.S. Недостатки буду фиксить в новом переиздании.

Деревья пожалей. Нафига переиздавать макулатуру?


 
Дмитрий СС   (2014-02-23 03:15) [44]

А что никто не вспомнил, что a и a=true не всегда эквивалентно? :)


 
Плохиш ©   (2014-02-23 03:26) [45]

Блииин, такое бурное обсуждение, решил почитать..
Представитель поколения пепси настукал макулатуру для поколения пепси. Желаю автору успехов набивании карманов баблом.
PS. Интересно, что за редакторы в этом издательстве, что такое опубликовали?


 
й   (2014-02-23 05:19) [46]

...среда объектно-ориентированного программирования (ООП) Delphi...

Delphi - это RAD IDE, т.е. интегрированная среда для ускоренной разработки и отладки программ
а ООП - набор средств языка, среды оно касается довольно-таки опосредованно

На сегодняшний момент выпущена очередная версия Delphi c возможностью разрабатывать как стандартные windows-приложения, так и приложения с использованием относительно новой технологии .NET.

мы в 2005 году?!?

Также парактикум может выступать

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

на этом энтузиазм кончился, извините
если повезет, завтра одолею вторую страницу (а там - кто знает - может, и на третью раздухарюсь)


 
Павиа   (2014-02-23 09:41) [47]


> Здесь контекст текста подразумевает схожесть между терминами,
>  дескриптор - описатель или разновидность указателя.

Во первых не подразумивается. Во вторых ваш источник не есть корректный.
Возьмите wikipedia посмотрите что такое handle, возьмите Марк Руссиновича Виноус для профессионалов. Да и вообще handle как раз предназначен для скрытия существующей структуры. И вообще предназначения хэндла  как раз для отказа от ссылок и дескрипторов.  
Так что вы не правы в корне.


 
Inovet ©   (2014-02-23 10:11) [48]

> [47] Павиа   (23.02.14 09:41)
> Так что вы не правы в корне

Это "несущественные мелочи", главное - наваять чё-нить.


 
Павиа   (2014-02-23 10:31) [49]


> Это "несущественные мелочи", главное - наваять чё-нить.

Дык не только мелочи. Вся структура книги не имеет общего плана. Нет учебного процесса.
Книга напоминает справочник. Но так как справки там почти 0.
А примеры не имеют законченного вида. То вообще не понятно о чём книга.

Больше пользы будет если студенту дать компьютер и 1 час потыкать компоненты. И ещё 1 час посмотреть примеры идущие вместе с Delphi.


 
big_djo ©   (2014-02-23 10:54) [50]

-->Дык не только мелочи. Вся структура книги не имеет общего плана.
-->Нет учебного процесса.
-->Книга напоминает справочник. Но так как справки там почти 0.

Это чистейшей воды практикум без лишней воды, теории там минимум.

Студенты могут выполнить все работы за 3 недели, они очень быстро понимают как создавать простые приложения и знакомятся непосредственно с ООП.

-->Delphi - это RAD IDE, т.е. интегрированная среда для ускоренной
-->разработки и отладки программ....

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


 
vuk ©   (2014-02-23 11:25) [51]

Судя по ознакомительному варианту, очередная плохая книжка, к объектно-ориентированному программированию отношения имеет мало. Скорее батонокидательство для начинающих.


 
DVM ©   (2014-02-23 11:28) [52]


> > Здесь контекст текста подразумевает схожесть между терминами,
>
> >  дескриптор - описатель или разновидность указателя.
>
> Во первых не подразумивается. Во вторых ваш источник не
> есть корректный.
> Возьмите wikipedia посмотрите что такое handle, возьмите
> Марк Руссиновича Виноус для профессионалов. Да и вообще
> handle как раз предназначен для скрытия существующей структуры.
>  И вообще предназначения хэндла  как раз для отказа от ссылок
> и дескрипторов.  
> Так что вы не правы в корне.

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


 
DVM ©   (2014-02-23 11:35) [53]

На мой взгляд, книга сыровата (сужу по одной главе).
По Delphi вообще мало книг толковых, большинство сводится к изучению палитры компонентов и т.д. Получается, что изучается не язык, не даже библиотеки классов, идущие с языком, а процесс визуального проектирования форм. А вот книг по языку, по внутренней кухне так сказать почти нет или очень мало.

Вот например, образец правильной книги по Delphi:

Рэй Лишнер.  Delphi. Справочник.
http://www.ozon.ru/context/detail/id/120699/

приятно читать даже после 13 лет с момента выхода.


 
Павиа   (2014-02-23 11:55) [54]


> Хэндл с одинаковым успехом может быть указателем

Дык автор утверждает, что он не указатель.


 
Павиа   (2014-02-23 12:06) [55]


> Это чистейшей воды практикум без лишней воды, теории там
> минимум. Студенты могут выполнить все работы за 3 недели,
>  они очень быстро понимают как создавать простые приложения
> и знакомятся непосредственно с ООП.

Методичка должна давать дополнительные знания, которые не вошли в теоретический курс.  Иначе какой смысл в такой книге?
Данная книга не даёт практических навыков. А описать 100 раз как перетащить компонент.


 
big_djo ©   (2014-02-23 12:18) [56]

-->Дык автор утверждает, что он не указатель
Где я такое утверждал? цитату?

-->Данная книга не даёт практических навыков. А описать 100 раз как
-->перетащить компонент.
Там исключительно практические навыки. Строчка с фразой "переместите на форму те или иные компоненты.. " является частью конкретных заданий


 
Вова   (2014-02-23 12:20) [57]


> Щелкните по кнопке, и вы получите то, что запрограммировали.


Ммм..да! Чукча не читатель, чукча писатель.


 
Inovet ©   (2014-02-23 12:49) [58]

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


 
brother ©   (2014-02-23 12:52) [59]

Как курс молодого бойца пойдет, но не более... только стиль оформления кода нужно править...


 
й   (2014-02-23 13:26) [60]

big_djo> можно сказать и так ,а можно сказать, что  Delphi  среда Объектно - ориентированного программирования, не вижу особой проблемы здесь..

В принципе можно ВСЁ, только зачем выдумывать свою собственную терминологию, когда есть общепринятая? Всем давно известно, что Delphi - это RAD IDE, осталось перевести это на русский.
И всё же моя придирка - справедлива. Среда не навязывает парадигм,  программирование в ней в процедурном стиле абсолютно ничем не ограничено. Библиотека VCL - объектная, но она не является частью среды, а прилагается к ней и компилятору.

А ваши споры с очевидным свидетельствуют, что потребность самовыразиться (обязательно внести что-то от себя) для вас важнее уважения к нормам и традициям.


 
й   (2014-02-23 13:31) [61]

стр. 6

Часто компонент называют еще и объектом.

До того, как объяснено, что чем является, не стоило говорить о том, как может кто-то что-то называть в неизвестном контексте.

Понятие "класс" является логической абстракцией, описывающей некоторый объект.

Малоинформативное высказывание, т.к. тут кругом одни логические абстракции.
Лучше сказать, что программный объект содержит данные о свойствах и состоянии конкретного внепрограммного объекта (например, для интерфейсного окна -
информацию о его размере, положении, цвете и т.д.), а класс содержит код, описывающий логику изменения этих состояний и то, что можно назвать
поведением объекта. Эта логика (код) - одна и та же как для конкретного объекта (окна), так и для всех объектов этого типа (класса).
Короче: данные - в объекте, код - в классе.

Фактически класс - это тип данных, определенный пользователем, а объект - его экземпляр.

Что значит "фактически"??? Это и ТЕОРЕТИЧЕСКИ так!

Для сравнения можно сказать, что класс - это форма для печенья, а объект - само печенье

Все аналогии хромают. Не лучше ли сказать, что класс очень похож на тип record (с объяснением отличий), а объект - просто переменная этого типа?
А то, что есть переменные и есть их типы и чем они отличаются, думаю, читающий должен был усвоить ранее.

(Про ссылочную природу объектных типов переменных (SizeOf(TObject) = 4), "кучу" (heap), где они реально хранятся,
особенности их присвоения друг другу, конструкторы и деструкторы, надеюсь, будет объяснено позже.
В любом случае для начала резонно обойтись без этого.)

Далее лучше всего было бы привести полный текст автоматически создаваемого модуля формы
(лучше - не совсем пустой, а после брошенной на форму кнопки и т.п.) и объяснить в нем КАЖДУЮ строчку.

Во многих случаях понятия "тип" и "класс" можно считать синонимами.

Зачем наводить этот туман, когда всё однозначно: класс является типом (т.е. его разновидностью), но не наоборот!

Можно сказать, что класс TForm является родительским для класса TForm1, который, в свою очередь, является его дочерним классом.

Термины "родительский" и "дочерний" (parent - child) общепринят в примении к окнам Windows (child привязан к parent и ограничен им) и аналогично к формам и компонентам VCL.
К классам чаще применяют другие термины - "предок" и "потомок"/"наследник"/"производный" (ancestor - derived).
Хотя parent"ом можно назвать ближайшего предка класса, а child"ом - ближайшего потомка.
Но для классов обычно значимы только факт родства и его направленность, а не близость.
Поэтому, чтобы избежать лишней многозачности, лучше, говоря о классах, ограничиться "предком" и "потомком"/"производным".
Хотя, конечно, ошибки тут нет.

Все компоненты в Delphi являются объектами

Есть классы компонентов, и есть экземпляры компонентов, не стоит их сваливать в одну кучу.
Чтобы не было путаницы, нужно очень осторожно употреблять одиночный термин "компонент",
лучше заменять его на "класс компонента" либо на "экземпляр компонента", где это уместно.

стр. 8

файл проекта (*.dpr), в котором хранится информация о проекте в целом и файл модуля (*.pas), в котором находится программный код.

В dpr - абсолютно такой же программный код!!! Но если ничего не менять - это только автоматически создаваемый код
загрузки "автоматически создаваемых" форм (выбираются в настройках проекта) и запуска основного цикла приложения.
Настройки проекта хранятся в .dof (для Delphi IDE) и .cfg (то же, но для DCC32, commandline compiler).

на этом мой бескорыстный порыв закончился


 
big_djo ©   (2014-02-23 13:39) [62]

--> А ваши споры с очевидным свидетельствуют, что потребность
--> самовыразиться (обязательно внести что-то от себя) для вас важнее
--> уважения к нормам и традициям.
Соглашусь. Более коректно будет написать что  Delphi - это IDE RAD, с другой стороны у большинства людей Delphi ассоциацируется со средой ООП, пусть и не обязательно там юзать ООП для разработки чего -либо


 
big_djo ©   (2014-02-23 13:53) [63]

-->
"Лучше сказать, что программный объект содержит данные о свойствах и состоянии конкретного внепрограммного объекта (например, для интерфейсного окна -
информацию о его размере, положении, цвете и т.д.), а класс содержит код, описывающий логику изменения этих состояний и то, что можно назвать
поведением объекта. Эта логика (код) - одна и та же как для конкретного объекта (окна), так и для всех объектов этого типа (класса).
Короче: данные - в объекте, код - в классе."

Хорошее замечание, учту

-->Не лучше ли сказать, что класс очень похож на тип record (с
-->объяснением отличий), а объект - просто переменная этого типа?

В книжке есть это:

Задание 15.2.4 Покажем, как получить доступ к адресу виртуального метода в таблице виртуаль-ных методов VMT объекта, а также при этом кратко опишем формат хранения объекта в памяти.

Нужно хотя бы примерно представлять себе, как же хранится сам объект в оперативной памяти, иными словами – каков его формат.
Внутренний формат данных самого объекта напоминает формат данных записи (тип record). Поля объекта сохранены в порядке объявления в виде последовательности непрерывных переменных. Любые поля, унаследованные от базового класса, сохранены перед новыми полями, определенными в классе – наследнике, а первое 4-байтное поле каждого объекта содержит 32-разрядный указатель на виртуальную таблицу методов (VMT) класса, которая содержит адреса всех виртуальных методов класса, независимо от того, унаследованы ли они от класса-родителя либо перекрыты (заменены) в классе-наследнике

-->(Про ссылочную природу объектных типов переменных
-->(SizeOf(TObject) = 4), "кучу" (heap), где они реально хранятся,
-->особенности их присвоения друг другу, конструкторы и деструкторы, -->надеюсь, будет объяснено позже.
-->В любом случае для начала резонно обойтись без этого.)
Есть частично

-->на этом мой бескорыстный порыв закончился

спасибо за порыв), попробую извлечь из него пользу


 
Inovet ©   (2014-02-23 14:03) [64]

> [63] big_djo ©   (23.02.14 13:53)
> в виде последовательности непрерывных переменных

Это что за термин?


 
clickmaker ©   (2014-02-23 14:22) [65]

> [64] Inovet ©   (23.02.14 14:03)
> > [63] big_djo ©   (23.02.14 13:53)
> > в виде последовательности непрерывных переменных

это примерно тоже, что "на совещании присутствовал узкий круг ограниченных офицеров"


 
Юрий Зотов ©   (2014-02-23 14:39) [66]

> big_djo

Извините за прямоту (Вы же сами этого хотели?), но складывается впечатление, что Вы и сами-то не вполне понимаете, что такое программирование. Просто другая заточка мозгов.

Это не хорошо и не плохо. Она просто другая.

Хотелось бы ошибиться. И в связи с этим просьба - не могли бы Вы привести список Ваших реальных проектов? Программ, то есть.


 
Юрий Зотов ©   (2014-02-23 14:49) [67]

А бывают еще и переменные прерывные. А если серьезно, то еще бывает и выравнивание полей.

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


 
turbouser ©   (2014-02-23 15:59) [68]

Фленов v 2.0


 
big_djo ©   (2014-02-23 19:21) [69]

Насчет "непрервыной " выпилю, и в книге нет описания формата RTTI, даются упрощенные сведения, книга написана для новичков


 
big_djo ©   (2014-02-23 20:37) [70]

Суть замечаний я понял, думаю вопрос можно закрыть


 
big_djo ©   (2014-02-23 20:37) [71]

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


 
Юрий Зотов ©   (2014-02-23 21:12) [72]

А что такое "формат RTTI"?


 
Inovet ©   (2014-02-23 21:15) [73]

> [72] Юрий Зотов ©   (23.02.14 21:12)

Это ещё один самобытный термин.


 
Юрий Зотов ©   (2014-02-23 21:23) [74]

> Inovet ©   (23.02.14 21:15) [73]

Даже слишком самобытный. Поскольку RTTI есть собрание разнородных субстанций, которые общего формата не имеют.

Кажется, я все же не ошибся. Увы.


 
big_djo ©   (2014-02-23 21:42) [75]

-->А что такое "формат RTTI"?
здесь приведена данная структура относительно делфи, в моей книжке её нет

pRTTI = ^RTTI;
RTTI = record
vtTypeInfo : Word; &#9552;&#9552;&#9552;{ короткий указатель на дополнительную
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;информацию о классе }
vtFieldTable: Word; &#9552;&#9552;{ короткий указатель на таблицу
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;с информацией о полях класса }
vtMethodTable : Word; { короткий указатель на таблицу
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;с информацией о методах класса}
vtDynamicTable: Word; { короткий указатель на таблицу
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;динамических методов }
vtClassName: Word; &#9552;&#9552;&#9552;{ короткий указатель на строку с именем класса } vtInstSize: Word; &#9552;&#9552;&#9552;&#9552;{ размер экземпляра класса }
vtParent: Pointer; &#9552;&#9552;&#9552;{ указатель на класс-предок }
vtDefault: Pointеr; &#9552;&#9552;{ указатель на метод-обработчик сообщений Windows } vtNewInst: Pointer; &#9552;&#9552;{ указатель на метод, создающий новый
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;экземпляр класса }
vtFreeInst: Pointer; &#9552;{ указатель на метод, уничтожающий
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9 552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552 ;&#9552;экземпляр класса }
vtDestroy : Pointer; &#9552;{ указатель на деструктор }
end;
http://mf.grsu.by/UchProc/konspekt/delphi/ch06/ch09/ch02


 
Юрий Зотов ©   (2014-02-23 21:55) [76]

> big_djo ©   (23.02.14 21:42) [75]
> в моей книжке её нет


И хорошо, что нет. Потому что эта информация:
- не документирована, а потому неизвестно откуда взялась;
- безнадежно устарела, так как относится только к Delphi 1;
- на сегодня неверна по той же причине;
- неполная, так как к RTTI относится еще и многое другое.


 
big_djo ©   (2014-02-23 22:35) [77]

В последней версии Делфи  плясать требуется от данной структуры:

 TRttiContext = record
 private
   FContextToken: IInterface;
 public
   class function Create: TRttiContext; static;
   procedure Free;

   function GetType(ATypeInfo: Pointer): TRttiType; overload;
   function GetType(AClass: TClass): TRttiType; overload;
   function GetTypes: TArray<TRttiType>;
   function FindType(const AQualifiedName: string): TRttiType;
   function GetPackages: TArray<TRttiPackage>;
 end;

Можно ли её считать форматом RTTI ?


 
Юрий Зотов ©   (2014-02-23 22:40) [78]

> big_djo ©   (23.02.14 22:35)

Полагаю, что эту структуру можно (и нужно) отнести к RTTI. Но к RTTI относится не только она.

И в Delphi 7 (о которой идет речь) такой структуры нет (точнее, что-то подобное может и есть, но не публикуется).


 
clickmaker ©   (2014-02-24 09:24) [79]

для Д7 можно отталкиваться от структуры TTypeInfo, хотя в целом поддержка RTTI там довольно сильно размазана по коду


 
И. Павел ©   (2014-02-24 10:06) [80]

Кажется, еще про это никто не писал:
color:=random(100000); // Придаем форме случайный цвет
...
if x mod 10 =0 then Shape1.Shape:=TShapeType(Random(6)+1);

Хотя бы про randomize упомяните.


> для новичка нормально так написать, пусть будет ясно что
> Drug сравнивается именно с true. Книжка не посвящена нюансам
> паскаля, паскал новички могут выучить по другим книжкам

Тогда после первого упоминания &laquo;if a = true&raquo; в книге можно написать, что можно писать и if a.

ЗЫ: а вообще, по-моему, нормальный практикум для новичков. Но перед печатью, ИМХО, стоило отдать книгу на вычитку.


 
clickmaker ©   (2014-02-24 10:09) [81]

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


 
Inovet ©   (2014-02-24 10:26) [82]

> [80] И. Павел ©   (24.02.14 10:06)
> Но перед печатью, ИМХО, стоило отдать книгу на вычитку.

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


 
clickmaker ©   (2014-02-24 11:01) [83]

> нормальный практикум для новичков

как раз таки для новичков не нормальный.
Потому как налицо стимулирование батонокидательства (= быдлокодерства) даже без попытки дать переменным осмысленные имена.
Взять хотя бы вот эти 2 строчки:
"Получилось вполне работоспособное приложение, работающее с Базой Данных без единой строчки кода.
При программировании БД в Delphi активно используется компонент DBNavigator1, который является мощным средством управления БД"


 
grossm ©   (2014-02-24 13:59) [84]

Меня давно мучает один вопрос-почему авторы не объясняют многих нужных ньюансов,не приводят простых примеров и т.д?
Вот список чего не достает в книгах(может не все упомяну):
1.Приводить весь код.В 99.99% книгах это игнорится.Пример из книги Фаронов Учебный курс 6:

type
 TMyClass = class(TObject)
   Field: Integer;
   .....
end;
var
 MyClass: TMyClass;
begin
 .....
 MyClass^.Field := 0;   //Ошибка! Следует писать так:
 MyClass.Field := 0;
 .....
end;

Теперь вопрос,а как новичок поймет,куда писать и что писать?В чем ошибка автора?Автор привел не весь код.И так во всех книгах и не только по Delphi.А Фленов Михаил,мой любимчик.Обожаю книгу "Библия Delphi".Более 800 страниц и не понятно о чем...

2.Примеры должны быть уровня новичка т.е. от простого,к сложному.

3.Учить надо простыми словами и терминологию объяснять.

4.Авторы что-то чиркают,про инкапсуляцию,наследование и полиморфизм и не дают примеров.Новичок должен представить то,чего он не знает.И с каждой главой,у читателя появляется больше вопросов и больше пробелов.
Там где можно дать пример,авторы объясняют словами.

5.Не даются советы,как начального уровня,так и более продвинутого.
И всякое по мелочи.
6.Информации слишком мало.Каждую тему надо объяснять подробно,а не по 10 страниц на главу.В итоге книга составит от 1000 страниц до 1500.

7.Соглашение.

8.Оптимизация.

9.Переносимость.

9.Что такое компонент в действительности?Ни в одной книге,не нашел объяснения,что после сохранения,в папке project появляется exe файл,которые и является программой.

И многое другое.

P.S.
У меня сложилось мнение,будто авторы намерено плохо учат,с целью не вырастить себе конкурентов.Обучать надо правильно,иначе может пропасть желание к дальнейшему обучению.Это можно отнести к преступлению:)Вот если б,ввели новый закон...книги стали бы качественнее:)

big_djo © полистай книгу Дейтел Как программировать на C++ 5 издание.Если напишешь книгу в таком стиле,то это будет еще одна(вторая по счету т.к. другие не признаю)замечательная книга для начинающих.


 
Ega23 ©   (2014-02-24 14:25) [85]

Вкратце:

"Работу вы проделали большую, сложную и никому не нужную." (с)

ИМХО.


 
Германн ©   (2014-02-24 15:34) [86]


> grossm ©   (24.02.14 13:59) [84]
>
> Меня давно мучает один вопрос-почему авторы не объясняют
> многих нужных ньюансов

Может лучше не надо объяснять нюансы? А то
При обычной установке компонента из палитры система делает владельцем этого компонента Форму. Проще всего поступать так же. Однако можно указать в качестве владельца сам этот компонент, воспользовавшись в качестве параметра ключевым словом Self.
http://www.delphi-manual.ru/dynamically-created-components.php


 
clickmaker ©   (2014-02-24 15:55) [87]

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


 
Inovet ©   (2014-02-24 16:11) [88]

> [86] Германн ©   (24.02.14 15:34)
> http://www.delphi-manual.ru/dynamically-created-components.php

Там тоже это... книго?


 
clickmaker ©   (2014-02-24 16:16) [89]

> Там тоже это... книго?

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


 
ухты   (2014-02-24 17:38) [90]


> Обожаю книгу "Библия Delphi".Более 800 страниц и не понятно
> о чем...
это не главное, автор не это преследовал


 
asail ©   (2014-02-24 17:52) [91]


> Обожаю книгу "Библия Delphi".Более 800 страниц и не понятно
> о чем...

Дык, эта... Библия, на то и Библия... Не более, чем набор сказок, но все тащатся. Религия, однако!
Надо будет сподобиться Ветхий Завет Дельфи 6 написать и озолотиться. Паствы, как я посмотрю, хватаить...


 
clickmaker ©   (2014-02-24 17:53) [92]

> Ветхий Завет Дельфи 6

Ветхий Завет должен начинаться с Трубопаскакаль 1.0


 
Игорь Шевченко ©   (2014-02-24 18:05) [93]

"Всякого только что родившегося младенца следует старательно омыть и, давши ему отдохнуть от первых впечатлений, сильно высечь со словами: «Не пиши! Не пиши! Не будь писателем!» "

А.П. Чехов


 
Jimmy   (2014-02-24 19:14) [94]

"Каждый мнит себя стратегом, видя бой со стороны."
Шота Руставели.


 
Rouse_ ©   (2014-02-24 19:47) [95]


> grossm ©   (24.02.14 13:59) [84]
> Меня давно мучает один вопрос-почему авторы не объясняют
> многих нужных ньюансов,не приводят простых примеров и т.
> д?

Меня другой вопрос мучает.
Почему авторы подобных пасквилей, не изучат хотя-бы саму суть предмета, излагаемого ими?
Смешно читать перлы типа:

Из метафизики:
Часто говорят, что объект является экземпляром класса. В некотором смысле объект – это «воплощение класса в реальность».

Фактически вся операционная система Windows организована на посылке и приеме сообщений.
Автор видимо имел ввиду только ее махонькую "оконную" часть? :)

Гениального исполнения вида:
if CheckBox1.Checked=true then timer1.Enabled:=true
else timer1.Enabled:=false.


Да по сути там что ни строчка - то перл, честно :)

Совет - не пиши пока что, а изучи предмет, о котором пишешь и убери из заголовка "Министерство образования и науки Российской Федерации" - не позорь контору.


 
Inovet ©   (2014-02-24 20:07) [96]

> [95] Rouse_ ©   (24.02.14 19:47)
> Гениального исполнения вида:
> if CheckBox1.Checked=true then timer1.Enabled:=true
> else timer1.Enabled:=false.

Ооо, до этого я просто не дочитал.

big_djo, ладно упирался насчёт
if a = true
А как такое из цитаты выше объяснить/оправдать? Ламерство и подготовка таких же ламеров - вот ответ. А, может, диверсия?


 
Юрий Зотов ©   (2014-02-24 20:12) [97]

Блин. В [66] я, увы, не ошибся. При таких перлах, как этот:
if CheckBox1.Checked=true then timer1.Enabled:=true else timer1.Enabled:=false
можно предположить, что единственный реальный проект автора - эта книга и есть.


 
Inovet ©   (2014-02-24 20:24) [98]

> [97] Юрий Зотов ©   (24.02.14 20:12)

Форматирование кода это подтверждает.


 
Rouse_ ©   (2014-02-24 20:45) [99]

Да это фигня - тут человек хотя бы азы знает.
Давеча общался со студентом ШЕСТОГО курса Бауманки, он 1С-ник.
22 года парню, спрошаю - че могешь?
Отвечает - та фсе.
Ок, грю, языки какие?
Да мы все проходили, от асма до 1С.
Ну подвожу его к компу и пишу код:

not eax
neg eax


Говорю - какой инструкцией можно заменить?
Отвечает - никакой, тут же математика.

Открываю код прошивки контроллера, говорю - читай.
Первая инструкция ввела в ступор:

BYTE GetFirstOP(WORD * pwParam, DWORD * pdwKey){...}
говорит - BYTE я не знаю что такое.
Ок, а WORD/DWORD?

Небыло у нас такого.

Пфф.. а что это само по себе - опознаешь?

Не, отвечает, я в этих ваших Дельфи не разбираюсь - вот было бы на Си - тогда я бы рассказал.

На этом я собственно тест и закончил, шестой курс, итить его в качель...


 
Dennis I. Komarov ©   (2014-02-24 20:53) [100]

Сань, он же 1с-ник, они давно на кириллицу эволюционировали... ;)


 
Rouse_ ©   (2014-02-24 21:00) [101]


> Dennis I. Komarov ©   (24.02.14 20:53) [100]
> Сань, он же 1с-ник, они давно на кириллицу эволюционировали.. ;)

Ну с чего-то эволюционировать то они ж должны были? :)


 
Inovet ©   (2014-02-24 21:32) [102]

> [99] Rouse_ ©   (24.02.14 20:45)
> not eax
> neg eax
>
> Говорю - какой инструкцией можно заменить?
> Отвечает - никакой, тут же математика.

Он асм не опознал что ли? Я вот тоже не отвечу, поскольку
1. не помню что там с флагами будет, вроде не должны влиять
2. по тактам что там будет после замены, если это важно.
Вывод - надо заглянуть в справку по этим инструкциям.


 
Rouse_ ©   (2014-02-24 21:37) [103]


> Он асм не опознал что ли? Я вот тоже не отвечу, поскольку
> 1. не помню что там с флагами будет, вроде не должны влиять
> 2. по тактам что там будет после замены, если это важно.
>
> Вывод - надо заглянуть в справку по этим инструкциям.

Это избыточно и даже ассемблера не нужно, нужно всего лишь помнить как число хранится :)
Если на дельфи, то чем заменить вот такую инструкцию:

Value := not Value * -1;


 
Dennis I. Komarov ©   (2014-02-24 21:38) [104]

Он Си опознал


 
Inovet ©   (2014-02-24 21:49) [105]

> [103] Rouse_ ©   (24.02.14 21:37)
> Value := not Value * -1;

А, ну это уже математика.:) Так, что там будет нот проинвертирует биты, нег тоже проинвертирует и что ещё? +1 сделает, чтобы +-0 не было. Итого +1 что ли. ну inc eax, тогда.


 
Rouse_ ©   (2014-02-24 21:54) [106]


> Inovet ©   (24.02.14 21:49) [105]

Угу, это тупо INC.

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


 
big_djo ©   (2014-02-24 22:04) [107]

Чтож поделать то) бывает, поменял
(timer1.Enabled:=CheckBox1.Checked)

С другой стороны хоть, тот вариант и кривой, он всё же не сильно портит код.

p.s. о себе и своей квалификации: не являюсь профессиональным программистом, программирование просто увлечение которое переросло в желание написать книжку.

p.s.2. С учетом выявленных косяков и претензий, решил полностью перекроить план новой версии книжки, многократно перепроверить и где-надо заменить код в каждой главе книжки.  

Новый вариант предварительно дам на вычитку нескольким специалистам


 
Rouse_ ©   (2014-02-24 22:11) [108]


> p.s. о себе и своей квалификации: не являюсь профессиональным
> программистом, программирование просто увлечение которое
> переросло в желание написать книжку.

Ну ты сам подумай, как можно писать книжку, считай учебное пособие, если сам только по вершкам хватаешь?
Вот попадется твое "творение" новичку и что?
Представь тебя в школе будет учить таблице умножения преподаватель которому "што шесть рублей, што два плюс три"?
Пошукай в инете кто такой Фленов - он тоже однажды книжки писал, народ какой год плюется.


> p.s.2. С учетом выявленных косяков и претензий, решил полностью
> перекроить план новой версии книжки, многократно перепроверить
> и где-надо заменить код в каждой главе книжки.  

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


 
Dennis I. Komarov ©   (2014-02-24 22:14) [109]

Суть в том, что он сильно портит именно код, не влияя на результат.
А хуже всего, что учит других писать так.
P.S. "Зина, в печку ее" (с)


 
Dimka Maslov ©   (2014-02-24 22:21) [110]


> p.s. о себе и своей квалификации: не являюсь профессиональным
> программистом, программирование просто увлечение которое
> переросло в желание написать книжку.


Вот интересно, почему у меня, после того как я на гитаре освоил три аккорда не появилось желание написать книжку "Теория музыки", а возникло желание п р о ч и т а т ь такую книжку? А я ведь тоже не являюсь профессиональным программистом... И вообще я когда-то работал под началом человека, который прежде чем написать книжку по строительной механике занимался оной дисциплиной в течении 40 (сорока) лет. Ведь если каждый, не разобравшись в предмете хотя бы процентов на пять-десять, начнёт писать по этому предмету учебники, и этому предмету, да и всему образованию придёт решительный и бесповоротный http://www.google.com/#newwindow=1&q=%D0%BF%D0%B5%D1%81%D0%B5%D1%86


 
big_djo ©   (2014-02-24 23:13) [111]

-->Пошукай в инете кто такой Фленов - он тоже однажды книжки писал,
-->народ какой год плюется.
Читал его совсем чуть-чуть, нормально пишет, мне было понятно по крайней мере.


 
Rouse_ ©   (2014-02-24 23:33) [112]


> big_djo ©   (24.02.14 23:13) [111]
> -->Пошукай в инете кто такой Фленов - он тоже однажды книжки
> писал,
> -->народ какой год плюется.
> Читал его совсем чуть-чуть, нормально пишет, мне было понятно
> по крайней мере.

Это и печалит, что тебе легко далась мягко говоря, не сильно достоверная информация...


 
Inovet ©   (2014-02-24 23:34) [113]

> [111] big_djo ©   (24.02.14 23:13)

Это пример - как НЕ надо писать.


 
Германн ©   (2014-02-25 00:18) [114]


> big_djo ©   (24.02.14 23:13) [111]
>
> -->Пошукай в инете кто такой Фленов - он тоже однажды книжки
> писал,
> -->народ какой год плюется.
> Читал его совсем чуть-чуть, нормально пишет, мне было понятно
> по крайней мере.

Родственные души. И тот и другой гордятся тем что пишут книги по Дельфи, которую они не изучали.


 
clickmaker ©   (2014-02-25 09:14) [115]

> p.s. о себе и своей квалификации: не являюсь профессиональным
> программистом, программирование просто увлечение которое
> переросло в желание написать книжку

научился решать квадратное уравнение и класть грид с дбнавигатором на форму - возникло желание поделиться радостью с окружающими


 
vuk ©   (2014-02-25 11:11) [116]

to Rouse_ ©   (24.02.14 22:11) [108]:

> Пошукай в инете кто такой Фленов - он тоже однажды книжки
> писал, народ какой год плюется.

Ну, народ-то тоже разный. Иные кушали - за уши не оттащишь. Помнится, даже секта поклонников у него была, не знаю, как сейчас.


 
имя   (2014-02-25 11:23) [117]

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


 
имя   (2014-02-25 11:27) [118]

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


 
историк   (2014-02-25 11:59) [119]

Марку Твену прислал как то начинающий поэт сборник стихов, с общим заглавием "Почему я живой". Твен ответил: "потому что не  принес лично"


 
Kerk ©   (2014-02-25 12:14) [120]

К нам как-то приходил на собеседование автор нескольких книжек про C++, посмотрели потом отзывы на эти книги в интернете, ох-ох-ох. Мне кажется, просто в некоторых кругах принято писать книги. Упомянутый автор полжизни проработал в военном НИИ каком-то, так что писательство вполне объяснимо. Преподаватели различные тоже любят писать. Результат обычно никакой, но зато книгу написал, длинный список публикаций - это почетно.

И зря вы кстати цепляетесь к програмерскому опыту автора. Вот кто-нибудь знает какие программы написал Марко Канту? К числу авторитетных программистов он явно не относится. Тем не менее, книги вроде неплохие получаются. Не зря же есть народная мудрость: кто умеет - делает, кто не умеет - учит :)

Но судя по отрывкам, которые я видел в этой ветке, книжка и правда адская :). Жаль, что других нет.


 
Kerk ©   (2014-02-25 12:22) [121]

Причем особенно печально то, что старый анекдот воспринимается как вполне реальная история. Эти люди писатели, а не читатели.

Я как-то спорил с одним преподавателем по поводу того, каким должен быть вводный курс в программирование. Надо ли начинать обучения с кидания кнопок на форму.

Разговор был трудным, преподаватели часто профессионально деформированы - они много общаются со студентами и любого человека автоматически воспринимают как вчерашнего школьника, которому нужно попытаться помочь и объяснить все непонятное.

В общем, как выяснилось, о классических вводных учебниках он не знает вообще ничего. Критерий качества для него - это то, что выпускников берут на работу. А опыт ведущих ВУЗов мира - это какая-то ерунда абстрактная.


 
Dennis I. Komarov ©   (2014-02-25 12:22) [122]

Отчитав таким образом Ивана, гость осведомился:
– Профессия?
– Поэт, – почему-то неохотно признался Иван.
Пришедший огорчился.
– Ох, как мне не везет! – воскликнул он, но тут же спохватился, извинился и спросил: – А как ваша фамилия?
– Бездомный.
– Эх, эх… – сказал гость, морщась.
– А вам, что же, мои стихи не нравятся? – с любопытством спросил Иван.
– Ужасно не нравятся.
– А вы какие читали?
– Никаких я ваших стихов не читал! – нервно воскликнул посетитель.
– А как же вы говорите?
– Ну, что ж тут такого, – ответил гость, – как будто я других не читал? Впрочем… разве что чудо? Хорошо, я готов принять на веру. Хороши ваши стихи, скажите сами?
– Чудовищны! – вдруг смело и откровенно произнес Иван.
– Не пишите больше! – попросил пришедший умоляюще.
– Обещаю и клянусь! – торжественно произнес Иван.


(С) М.А.Булгаков


 
Romkin ©   (2014-02-25 15:11) [123]


> Ну подвожу его к компу и пишу код:
not eax
neg eax
> Говорю -  какой инструкцией можно заменить?

Розыч, вот все спросить хочу, а ты в курсе, что это скорее всего НЕ эквивалент inc?


 
Rouse_ ©   (2014-02-25 16:27) [124]


>  это скорее всего

Что значит "скорее всего"?
Ты определись уже - либо эквивалент, либо нет :)


 
Дмитрий Белькевич   (2014-02-25 16:32) [125]

Чего не хватало и не хватает в книгах.

1. Оптимизация кода. До какой-то степени пробел заполнила "Чистый код" Боба Мартина, есть интересные мысли.
2. Поиск глюков. Тема огромная, вообще ничего не видел по теме. Хочется что-то почитать, да уже скоро и писать пора что-то, за 11 лет их отлова :)


 
clickmaker ©   (2014-02-25 16:37) [126]

> Поиск глюков. Тема огромная, вообще ничего не видел по теме

кому же охота признаваться, да еще и в книге?


 
Ega23 ©   (2014-02-25 16:51) [127]


> Ты определись уже - либо эквивалент, либо нет :)


Если я правильно понял Рому, то

1. У Inc есть второй параметр.
2. Inc отслеживает принимаемый тип.

type

 TFoo = (t1, t2, t3, t4, t5);

const
 cFoo: array[TFoo] of string = ("t1", "t2", "t3", "t4", "t5");

procedure TForm11.Button3Click(Sender: TObject);
var
 t: TFoo;
begin
 t := t1;
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
 ShowMessage(cFoo[t]);
 Inc(t);
end;

procedure TForm11.Button4Click(Sender: TObject);
var
 t: ShortInt;
begin
 t := 127;
 Inc(t);
 ShowMessage(IntToStr(t));
end;


 
Ega23 ©   (2014-02-25 16:52) [128]


> Тема огромная, вообще ничего не видел по теме. Хочется что-то почитать


У Розыча про отладчик статья хорошая была.


 
Германн ©   (2014-02-25 16:54) [129]


> У Розыча про отладчик статья хорошая была.

Розыч про глюки ничего вроде не писал.


 
Inovet ©   (2014-02-25 17:01) [130]

> [127] Ega23 ©   (25.02.14 16:51)
> 1. У Inc есть второй параметр.

а где в исходнике eax?


 
Romkin ©   (2014-02-25 17:02) [131]


> Rouse_ ©   (25.02.14 16:27) [124]
> >  это скорее всегоЧто значит "скорее всего"? Ты определись
> уже - либо эквивалент, либо нет :)

Дык от процессора зависеть может. Так-то флаги не совпадают.

А
not AX
inc AX
точно не эквивалент NEG, поскольку иногда дает неверный результат.


 
Inovet ©   (2014-02-25 17:03) [132]

> [131] Romkin ©   (25.02.14 17:02)
> Так-то флаги не совпадают

Про флаги я сразу спросил.


 
MBo ©   (2014-02-25 17:10) [133]

>Дмитрий Белькевич   (25.02.14 16:32) [125]
>Чего не хватало и не хватает в книгах.
>2. Поиск глюков
По обработке ошибок
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1392


 
Дмитрий Белькевич   (2014-02-25 18:13) [134]

>По обработке ошибок

Видел - статья замечательная, интересует не только то, что описано в статье. Методы поиска и локализации разнообразных проблем, "бегающие глюки", нестабильность в программе, глюки из-за нереалтаймовости, наведенные глюки, методы помогающие "проявить" баг (не всегда это именно AV/исключение, бывает неверное поведение программы). Мы за некоторыми глюками гоняемся месяцами. Для выявления некоторых приходится специальные дополнительные утилиты писать (из интересного, например, имитация dos"а сервера, раздающего html).


 
Rouse_ ©   (2014-02-25 18:36) [135]


> Romkin ©   (25.02.14 17:02) [131]
> Дык от процессора зависеть может. Так-то флаги не совпадают.
> А
> not AX
> inc AX
> точно не эквивалент NEG, поскольку иногда дает неверный
> результат.

А я разве утверждал что-то подобное? :)


 
ТНЕ картман   (2014-02-25 19:17) [136]


> Дмитрий Белькевич   (25.02.14 18:13) [134]

Хождение по мукам))


 
Inovet ©   (2014-02-25 19:35) [137]

> [136] ТНЕ картман   (25.02.14 19:17)
> Хождение по мукам))

по мухам
по тараканам


 
big_djo ©   (2014-02-25 19:58) [138]

В данный момент меняю главу про динамический полиморфизм, и
у меня возник вопрос - насколько сильна была необходимость в ведении слова reintroduce? В принципе и без него все работает, он просто подавляет предупреждения компилятора и явно указывает компилятору на замену метода новым виртуальным или статическим. Еще читабельность кода лучше.
Но в принципе можно и  без него же было обойтись так?


 
жена полковника Вагина   (2014-02-25 20:05) [139]

если в принципе,
то то, что исполняет синфонический оркестр со скрипкой можно в принципе настучать одним пальцем по барабану.

это если в принципе.

все то же самое, но оркестр просто читабельность и узнаваемость произведения повышает по сравнению с пальцем.


 
Юрий Зотов ©   (2014-02-25 20:06) [140]

> big_djo ©   (25.02.14 19:58) [138]

Reintroduce не только подавляет предупреждении компилятора, он еще явно обозначает начало новой цепочки наследования. Это улучшает читабельность кода.

А что такое "динамический полиморфизм"?


 
big_djo ©   (2014-02-25 20:21) [141]

-->он еще явно обозначает начало новой цепочки наследования.
только лишь явно, а новая цепочка начнется просто при отсутствии override, получается основная роль всё же лишь для  улучшения читабельности.

Получается я не сделаю ошибку если буду писать reintroduce для замены обычных статических методов, это же улучшит читабельность так?
Хотя статические методы никто этим словом не заменяет


 
big_djo ©   (2014-02-25 20:28) [142]

-->А что такое "динамический полиморфизм"?
У меня в книжке такое определение
Полиморфи&#769;зм (от греч. &#960;&#959;&#955;&#8058;- — много, и &#956;&#959;&#961;&#966;&#942; — форма) в языках программирования — возмож-ность объектов с одинаковой спецификацией иметь различную реализацию. Кратко смысл полимор-физма можно выразить фразой: «Один интерфейс, множество реализаций»

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


 
жена полковника Вагина   (2014-02-25 20:36) [143]

по моему ты не те книжки читаешь джо.

полиморфизм - это полиморфизм.
а как диспетчерезация происходит - по типу переменной у которой вызывается метод, или по типу объекта, который в этой переменной лежит - это уже динамический/статический.

но не полиморфизм, а метод.
да.


 
big_djo ©   (2014-02-25 20:39) [144]

И кстати, почему бы не сделали, например улучшение читабельности при замены метода, просто написание с больших букв, вместо reintroduce?

например вместо:
TA= class
f() ; virtual;
end;

TB=class(TA)
f(); reintroduce;

писать:
TA= class
f() ; virtual;
end;

TB=class(TA)
f(); Virtaul;// Начало новой цепочки


 
big_djo ©   (2014-02-25 20:40) [145]

-->полиморфизм - это полиморфизм.
очень понятное определение))


 
Kerk ©   (2014-02-25 20:43) [146]

Динамический полиморфизм? С больших букв?

Скажите, а где вы преподаете?


 
Ega23 ©   (2014-02-25 20:43) [147]


> а новая цепочка начнется просто при отсутствии override



type

 TFoo1 = class (TObject)
 protected
   FStrings: TStrings;
 public
   constructor Create(Strings: TStrings);
   procedure Foo; virtual;
 end;

 TFoo2 = class (TFoo1)
 public
   procedure Foo; override;
 end;

 TFoo3 = class (TFoo2)
 public
   procedure Foo; virtual;
 end;

 TFoo4 = class (TFoo3)
 public
   procedure Foo; override;
 end;

 TForm26 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   procedure DoSomething(foo: TFoo1);
 public
   { Public declarations }
 end;

var
 Form26: TForm26;

implementation

{$R *.dfm}

{ TFoo1 }

constructor TFoo1.Create(Strings: TStrings);
begin
 inherited Create;
 FStrings := Strings;
end;

procedure TFoo1.Foo;
begin
 FStrings.Add("TFoo1.Foo");
end;

{ TFoo2 }

procedure TFoo2.Foo;
begin
 inherited;
 FStrings.Add("TFoo2.Foo");
end;

{ TFoo3 }

procedure TFoo3.Foo;
begin
 inherited;
 FStrings.Add("TFoo3.Foo");
end;

{ TFoo4 }

procedure TFoo4.Foo;
begin
 inherited;
 FStrings.Add("TFoo4.Foo");
end;

procedure TForm26.Button1Click(Sender: TObject);
var
 foo: TFoo4;
begin
 Memo1.Clear;
 foo := TFoo4.Create(Memo1.Lines);
 try
   DoSomething(foo)
 finally
   foo.Free;
 end;
end;

procedure TForm26.DoSomething(foo: TFoo1);
begin
 foo.Foo;
end;

end.


 
big_djo ©   (2014-02-25 20:50) [148]

-->
-->Ega23 ©

-->TFoo3 = class (TFoo2)
public
  procedure Foo; virtual;
end;

-->TFoo4 = class (TFoo3)
public
  procedure Foo; override;
end;

И что? в чем пример? в TFoo3  вы не пишете reintroduce перед virtual начинаёте новую цепочку и всё ок, а могли бы и написать


 
Кщд   (2014-02-25 21:01) [149]

Евгений Владимирович, в Абакане также холодно, как у нас, в Новосибирске?


 
big_djo ©   (2014-02-25 21:03) [150]

очень холодно))


 
Ega23 ©   (2014-02-25 21:04) [151]

Не, я не то хотел написать.
Ща.


 
Ega23 ©   (2014-02-25 21:11) [152]

Хм.. Признаться, я думал, что

 TFoo3 = class (TFoo2)
 public
   procedure Foo(a: Integer); virtual;
 end;

 TFoo4 = class (TFoo3)
 public
   procedure Foo(a: Integer); override;
 end;


не скомпилится.


 
Inovet ©   (2014-02-25 21:14) [153]

> [144] big_djo ©   (25.02.14 20:39)
> И кстати, почему бы не сделали, например улучшение читабельности
> при замены метода, просто написание с больших букв, вместо
> reintroduce?

Во-первых, в Паскале регистр букв не важен, во-торых, регистром удобно пользоваться при именовании. Это тоже надо бы в книжке ненавязчиво показывать в примерах
Вот в том квадратном упавнении вместо
Edit1, Edit2, Edit3
дать имена
edA, edB, edC
сразу видно - это TEdit-ы и что в них вводится. Вот это повышает читабельность. Ключевое слово тоже повышает читабельность лучше, чем бы был регистр.


 
Ega23 ©   (2014-02-25 21:19) [154]

А, вот оно.
http://stackoverflow.com/questions/741735/what-is-the-meaning-of-the-reintroduce-and-override-directives-in-delphi
В принципе, доходчиво.

Из той же серии - для чего нужен virtual; abstract, ежели можно просто virtual с пустым телом.


 
Inovet ©   (2014-02-25 21:20) [155]

> [149] Кщд   (25.02.14 21:01)
> в Абакане также холодно, как у нас, в Новосибирске?

У них теплее, там помидоры выращивают для половины Сибири - юга-с.


 
жена полковника Вагина   (2014-02-25 21:21) [156]

-->полиморфизм - это полиморфизм.
очень понятное определение))


type
TOneClass = class;
TTwoClass = class(TOneClass);

var myvar : TOneClass;
begin
myvar := TTwoClass.create();
myvar.SomeStaticMethod;

Я так понимаю, что у некоторых преподов это будет называться либо "статическим" полиморфизмом, либо не полиморфизмом вообще.


 
big_djo ©   (2014-02-25 21:22) [157]

-->в Паскале регистр букв не важен
можно было бы сделать привязку регистра только к ключевым словам virtaul, abstract и dynamic

-->Вот в том квадратном упавнении вместо
-->Edit1, Edit2, Edit3
-->дать имена edA, edB, edC
-->сразу видно - это TEdit-ы и что в них вводится. Вот это повышает
-->читабельность.
специально не стал заморчаиваться над этим, просто сказал что имена компонентов можно менять. Но в принципе замечание учту.


 
big_djo ©   (2014-02-25 21:26) [158]

-->Хм.. Признаться, я думал, что
-->TFoo3 = class (TFoo2)
--> public
-->   procedure Foo(a: Integer); virtual;
--> end;

--> TFoo4 = class (TFoo3)
--> public
-->   procedure Foo(a: Integer); override;
--> end;

-->не скомпилится.

почему так думали? на основании чего?


 
Ega23 ©   (2014-02-25 21:27) [159]


> можно было бы сделать привязку регистра только к ключевым
> словам virtaul, abstract и dynamic


Э нет, тогда одуреешь ошибку искать. Либо строго CS, либо строго CI.


 
Inovet ©   (2014-02-25 21:29) [160]

> [157] big_djo ©   (25.02.14 21:22)
> можно было бы сделать привязку регистра только к ключевым
> словам virtaul, abstract и dynamic

Нет. Тут или делаем для всего или не делаем. В Си регистр различается, но никто не догадался к нему привязывать семантику. Ну, есть там просто договорённость, что некоторую библиотечную фигню будем целиком в верхнем регистре обзывать, просто, чтобы сразу в глаза бросалось и не спутать, но это к языку как раз и не имеет отношения.


 
Ega23 ©   (2014-02-25 21:30) [161]


> почему так думали? на основании чего?


Задницей чуял.
Подвела.


 
big_djo ©   (2014-02-25 21:30) [162]

-->У них теплее,там помидоры выращивают для половины Сибири - юга-с.
Еще у нас в городе магазинов больше чем людей, хотя город маленький, а с помидорами проблем нет))


 
Inovet ©   (2014-02-25 22:05) [163]

> [162] big_djo ©   (25.02.14 21:30)

Помнится ребята из Абакана много чего полезного писали под Yamaha MSX-2, типа - аналог Нортон Командер, многооконный текстовый редактор ТОР тоже вроде бы они. Ещё Золотарёв Андрей из Абакана писал под ТВ тюнеры софт намного лучший фирменного. Ещё программисты из Абакана ездили за велосипедами в Красноярск в магазин Триал Спорт - когда-то увидел в Инете их фотоотчёт.

Так что прогаммистов там тоже много.


 
Дмитрий Белькевич   (2014-02-25 22:16) [164]

>Хождение по мукам))

Есть трохи :)

>не скомпилится.

Да вроде нет противопоказаний.


 
clickmaker ©   (2014-02-25 22:17) [165]


> А что такое "динамический полиморфизм

я всегда думал, что полиморфизм - он как бы по умолчанию динамический.
А статический - это что-то из серии шаблоны/дженерики


 
Макс Черных   (2014-02-25 22:25) [166]


> "Работу вы проделали большую, сложную и никому не нужную.
> " (с)

Если точно цитировать, то:
 Работу вы, товарищ, проделали большую, трудную и никому не нужную.  М.Горький (с)

Но, имхо, в данном случае самой уместной будет знаменитая фраза Б.Шоу:  Those who can, do; those who can"t, teach.


 
жена полковника Вагина   (2014-02-25 22:36) [167]

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

а некоторым всегда казалось что полиморфизм никак не связан ни с динамичностью ни со статичностью.

у меня может быть дерево классов без единого виртуального метода (унаследованные от базовых не считаем)
и это никак не помешает мне полиморфно поступать со всем этим хозяйством.


 
big_djo ©   (2014-02-25 22:36) [168]

-->Но, имхо, в данном случае самой уместной будет знаменитая фраза
-->Б.Шоу:  Those who can, do; those who can"t, teach
ко мне это не относится) даже если бы я был профессиональным программером, я бы всё равно книжку написал) мне нравится программирование и всё тут


 
картман ©   (2014-02-25 22:39) [169]

кто умеет - учит, кто не умеет - делает.
Надо будет запомнить))


 
Styx   (2014-02-25 22:44) [170]


> можно было бы сделать привязку регистра только к ключевым
> словам virtaul, abstract и dynamic

Ы, и число пробелов считать, как в питоне. Вот весело будет :-D


 
Полковник Вагин   (2014-02-25 22:44) [171]

> никак не помешает мне полиморфно поступать со всем этим
> хозяйством

вот-вот, совсем хозяйство забросила. Только и знает, что на форумах полиморфно выступать


 
DVM ©   (2014-02-25 22:48) [172]


> жена полковника Вагина   (25.02.14 22:36) [167]


> у меня может быть дерево классов без единого виртуального
> метода (унаследованные от базовых не считаем)
> и это никак не помешает мне полиморфно поступать со всем
> этим хозяйством.
>
>

Речь вероятно о так называемом полиморфизме подтипов (другое название динамический полиморфизм). Честно говоря, я слабо представляю, зачем такое может понадобится на практике, если нет ни одного виртуального метода. Если не затруднит, приведи пример.


 
жена полковника Вагина   (2014-02-25 22:54) [173]

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

переменная кар типа тавто.
объекты типа тбмв, тшоха, тшкода.

кар.startengine

если даже startengine будет статичен, то полиморфизм от этого никуда не испаряется.

если стартэнджин виртуален, то тем более.
если же он еще и переопределен у всех или некоторых машинок, то это все тот же самый полиморфизм. ни динамический и ни статический.
это просто полиморфизм.

я как программист завожу все свои машинки полиморфно.


 
Kerk ©   (2014-02-25 22:56) [174]

Я ведь раньше знал, чем сабклассинг от сабтайпинга отличается, но сейчас забыл. Старость не радость. Освежите?


 
clickmaker ©   (2014-02-25 23:03) [175]

> если даже startengine будет статичен, то

полиморфизма не получится


 
DVM ©   (2014-02-25 23:03) [176]


> жена полковника Вагина   (25.02.14 22:54) [173]


> полиморфизм нужен программисту чтобы иметь возможность имея
> переменную одного типа и объекты разных типов (на которые
> она ссылается) - вызывать одни и те же методы.

Да, одни и те же методы... Только вот имея на руках переменную базового типа, ссылающуюся на экземпляр наследника, ты не вызовешь метод наследника с тем же названием, что у базового. Это не полиморфизм.


 
жена полковника Вагина   (2014-02-25 23:08) [177]

и что с того?
или это обязательно для счастья?

например у меня фолкс и октавия.
один концерн, один движок.
заводится одинаково.
метод статический. унаследован и не реинтродьюсен.

и с фига ли это не полиморфизм?


 
жена полковника Вагина   (2014-02-25 23:11) [178]

другой пример:
все тоже самое, но метод стартэнджин виртуальный.
но в наследниках не переопределен.

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

это уже полиморфизм?
или еще уже снова нет?


 
clickmaker ©   (2014-02-25 23:11) [179]

> метод статический. унаследован

не скомпилиццо


 
DVM ©   (2014-02-25 23:13) [180]


> жена полковника Вагина   (25.02.14 23:08) [177]
> и что с того?
> или это обязательно для счастья?

Это и есть суть полиморфизма. Наследник создает свою реализацию метода базового класса. Не делает еще один метод с тем же названием, закрывая таким образом метод базового класса, а делает именно свою реализацию.


 
жена полковника Вагина   (2014-02-25 23:15) [181]

да неужели?

бат хау эбаут зис:

 TObject = class
   constructor Create;

статический конструктор.


 
DVM ©   (2014-02-25 23:15) [182]


> жена полковника Вагина   (25.02.14 23:11) [178]


> всю реальную работу по запуску движка будет делать метод
> в базовом классе.
>
> это уже полиморфизм?
> или еще уже снова нет?

Это наследование.


 
жена полковника Вагина   (2014-02-25 23:16) [183]

а делает именно свою реализацию.

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


 
жена полковника Вагина   (2014-02-25 23:17) [184]

Это наследование.

а это динамическое наследование или статическое?


 
clickmaker ©   (2014-02-25 23:18) [185]

> [181] жена полковника Вагина   (25.02.14 23:15)

скомпили
TCar = class
 procedure startengine; // статический
end;

TBmw = class(TCar)
 procedure startengine; override;
end;


 
жена полковника Вагина   (2014-02-25 23:21) [186]

ты сам скомпили.
где я говорил про оверрайд?


 
clickmaker ©   (2014-02-25 23:22) [187]

> где я говорил про оверрайд?

а без него не будет полиморфизма


 
DVM ©   (2014-02-25 23:22) [188]


> жена полковника Вагина   (25.02.14 23:16) [183]
> а делает именно свою реализацию.
>
> представь что своя реализация бывает не нужна.
> представь что базовый класс уже умеет это.

Ну замечательно, причем тут полиморфизм то? Наследник наследует метод предка.


 
Inovet ©   (2014-02-25 23:24) [189]

> [171] Полковник Вагин   (25.02.14 22:44)
> Полковник Вагин

> [173] жена полковника Вагина   (25.02.14 22:54)

Муж полковника Урин не из вашей семьи?


 
жена полковника Вагина   (2014-02-25 23:26) [190]

ну наследует.
и я его вызываю.
у переменной с типом предка.

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

полиморфизм в обоих случаях живет и действует.

ему все равно как происходит диспетчеризация методов.
он не для этого придуман.


 
DVM ©   (2014-02-25 23:26) [191]


> жена полковника Вагина   (25.02.14 23:17) [184]
> Это наследование.
>
> а это динамическое наследование или статическое?

Это просто наследование. Что такое динамическое наследование и статическое я не знаю.


 
vuk ©   (2014-02-25 23:27) [192]

to DVM ©   (25.02.14 23:13) [180]:

> Это и есть суть полиморфизма. Наследник создает свою реализацию
> метода базового класса.

Полиморфизм, в принципе, может быть без наследования. Наследование - это один из способов его реализации.


 
жена полковника Вагина   (2014-02-25 23:28) [193]

ну а я не знаю что такое динамический/статический полиморфизм.


 
big_djo ©   (2014-02-25 23:30) [194]

-->жена полковника Вагина   (25.02.14 23:16) [183]
-->а делает именно свою реализацию.

-->представь что своя реализация бывает не нужна.
-->представь что базовый класс уже умеет это.

то есть, сама возможность установки указателя на любой объект производного класса, преследует цель иметь возможность запустить переопределенный(или нет) в наследнике метод. А есть переопределенная реализация метода в наследнике или нет, это не важно, так?

это и есть полиморфизм?

Допустим её нет, то вызовется метод базовый, а если есть, то метод наследника.


 
жена полковника Вагина   (2014-02-25 23:32) [195]

Полиморфизм, в принципе, может быть без наследования.

Интересно как же без наследования поиметь разнородные объекты?

а полиморфизм - однообразное управление объектами разных типов.

ЗЫ то что улыбка может существовать без чеширского кота - я подозревал.


 
vuk ©   (2014-02-25 23:34) [196]

to жена полковника Вагина   (25.02.14 23:32) [195]:

> Интересно как же без наследования поиметь разнородные объекты?

Навскидку в Delphi имеем еще два способа:
1. Интерфейсы
2. COM Automation


 
DVM ©   (2014-02-25 23:36) [197]


> vuk ©   (25.02.14 23:27) [192]


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

Вероятно. Но для ООП языков наследование самый распространенный способ.


> жена полковника Вагина   (25.02.14 23:28) [193]
> ну а я не знаю что такое динамический/статический полиморфизм.
>

Вообще то это общепринятая терминология. Динамический полиморфизм.


 
жена полковника Вагина   (2014-02-25 23:37) [198]

ну если нет наследования, у вас будет ровно один тип интерфейса.
а все ком-объекты они и так для делфи одного типа (толеауто)

итак где же здесь разнородные объекты возьмутся?
если нет наследования?


 
жена полковника Вагина   (2014-02-25 23:42) [199]

плюс интересно было бы поглядеть реализацию переопределенных методов интерфейса при отсутствии наследования.

сам интерфейс реализации не содержит.
реализация делается в классе, наследующем интерфейс.
а наследования у нас тут нет (ну мы тут рассматриваем навязанный мне случай когда наследования нет)


 
DVM ©   (2014-02-25 23:42) [200]


> жена полковника Вагина   (25.02.14 23:26) [190]


> полиморфизм в обоих случаях живет и действует.
>
> ему все равно как происходит диспетчеризация методов.
> он не для этого придуман.
>
>

Есть такой признак полиморфизма:

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

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


 
vuk ©   (2014-02-25 23:44) [201]

Полиморфизм - возможность однородной обработки разнородных данных.  Не более того.

В случае с интерфейсами однородность задает интерфейс. Но он не задает реализацию и поэтому там нет наследования кода. При этом полиморфизм достигается за счет реализации интерфейса разными класссами.

В случае с COM Automation дело обстоит так, что однородность определяется вызывающим кодом и работает до тех пор, пока этот код не нарвется на объект, который не сможет отработать требуемые вызовы. Но пока может, таки да, обработка будет полиморфной.


 
жена полковника Вагина   (2014-02-25 23:50) [202]

Полиморфизм - возможность однородной обработки разнородных данных.  Не более того.


я как бы про это весь вечер и говорю.

В случае с интерфейсами однородность задает интерфейс. Но он не задает реализацию и поэтому там нет наследования кода. При этом полиморфизм достигается за счет реализации интерфейса разными класссами.


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

не дофига сферических коней получается?


 
DVM ©   (2014-02-25 23:56) [203]


> жена полковника Вагина   (25.02.14 23:50) [202]


> Ну и как же полиморфизм без наследования будет работать
> на интерфейсах, если наследования нет,
> интерфейс не содержит реализации
> реализация должна быть в классе наследующем интерфейс
> но наследовать интерфейс мы не можем, потому что наследования
> у нас нет.

Рассматривай интерфейсы Delphi как полностью абстрактные классы все методы которых виртуальные. Собственно в C++ нет интерфейсов и их заменяют именно такие классы.


 
Юрий Зотов ©   (2014-02-25 23:58) [204]

> big_djo ©   (25.02.14 20:28) [142]
> У меня в книжке такое определение


Прискорбно. Вы это определение где-то вычитали, или тоже сами придумали?

Дело в том, что никакого динамического полиморфизма не существует. А то, о чем Вы говорите называется просто полиморфизмом.

Пара вопросов, если позволите...

1. Кто рецензировал Вашу книгу?
2. Вам за нее все еще не стыдно?


 
vuk ©   (2014-02-25 23:59) [205]

to DVM ©   (25.02.14 23:36) [197]:

> Вероятно. Но для ООП языков наследование самый распространенный
> способ.

Чтобы далеко не ходить, возьму, например, 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)

Тоже полиморфизм без наследования в чистом виде.

to жена полковника Вагина   (25.02.14 23:50) [202]:

> но наследовать интерфейс мы не можем, потому что наследования
> у нас нет

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


 
Компромисс1 ©   (2014-02-26 00:03) [206]

наследовать интерфейс

Терминология Delphi портит программистов. Интерфейсы не наследуются, они реализуются.
class MyClass extends Object implements MyInterface


 
DVM ©   (2014-02-26 00:07) [207]


> Компромисс1 ©   (26.02.14 00:03) [206]


> Интерфейсы не наследуются,

еще как наследуются


 
жена полковника Вагина   (2014-02-26 00:08) [208]

теперь смотрите (внимательно) что получается в итоге.

я говорю, что виртуальность методов полиморфизму не мешает, но строго говоря и отсутствие их полиморфизму пофик.

мне говорят, что все что пишу - это тупо наследование.

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

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

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

И это по вашим же словам тру полиморфизм (и я даже согласен с этим)

но постойте постойте.
теперь реализация методов интерфейса у нас в самых неожиданных классах.
и нам теперь даже нафик не надо чтобы эти методы были :
1. унаследованы от предков.
2. были бы виртуальными.

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

это будет работать правильно и по вашим же словам это будет полиморфизмом.

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

спасибо что дочитали до конца.


 
vuk ©   (2014-02-26 00:08) [209]

to Компромисс1 ©   (26.02.14 00:03) [206]:

> Терминология Delphi портит программистов. Интерфейсы не
> наследуются, они реализуются.

Это не является терминологией Delphi. Это является просто кривой терминологией. А так, вообще, у интерфейсов своя, отдельно стоящая иерархия имеется.


 
Юрий Зотов ©   (2014-02-26 00:11) [210]

> vuk ©

И все же реализацию через интерфейсы я бы полиморфизмом не назвал. Скорее, это ближе к плагинной архитектуре.


 
DVM ©   (2014-02-26 00:12) [211]


> жена полковника Вагина   (26.02.14 00:08) [208]

Представь, если бы в Delphi не было интерфейсов, но было бы множественное наследование и полностью абстрактные классы (собственно они уже есть). Тогда все согласуется. Т.е проблема именно в ключевом слове interface.


 
vuk ©   (2014-02-26 00:15) [212]

Юр, плагинная архитектура - тоже способ реализации полиморфизма. :P


 
big_djo ©   (2014-02-26 00:22) [213]

-->Прискорбно. Вы это определение где-то вычитали, или тоже сами
-->придумали?
Любое определение хромает

-->Дело в том, что никакого динамического полиморфизма не
-->существует.
-->А то, о чем Вы говорите называется просто полиморфизмом.

как выяснилось в данной теме не все так считают

-->Пара вопросов, если позволите...
-->1. Кто рецензировал Вашу книгу?

Для публикации рецензия не требовалась

-->2. Вам за нее все еще не стыдно?
В целом есть недочеты, но я их поправлю, считаю что простые вещи могу донести до студентов.


 
жена полковника Вагина   (2014-02-26 00:23) [214]

хорошо.
конкретный пример.

пишу я продвинутый гуи.
мне надо полиморфно обработать tlabel и tdataset (ну вот придумал я так)
если я это реализую, мой проект будет лаконичным, легко поддерживаемым и т.д. В общем так надо.

Я пишу интерфейс и прикручиваю его к наследникам лейбла и датасета.
Просто потому что писать честную пользовательскую иерархию классов отнаследовавшись от предка tlabel и дойти до датасета у меня не хватит жизни.

написал предков, реализовал интерфейс в обоих.

имею : TMyLabel.СделайМнеХорошо()
         TMyDataSet.СделайМнеХорошо()

и они мне делают хорошо.

полиморфизм?
в философическом смысле этого слова не знаю,
но с точки зрения пользователя этих классов - несомненно полиморфизм.

и обе реализации СделайМнеХорошо() не имеют никакого отношения ни к вирутальнотсти ни к наследованию.


 
DVM ©   (2014-02-26 00:24) [215]


> vuk ©   (25.02.14 23:59) [205]


> Тоже полиморфизм без наследования в чистом виде.

В документации на Visual Basic такой способ полиморфизма не отражен:

http://msdn.microsoft.com/ru-ru/library/28t6afce(v=vs.90).aspx

Там только интерфейсы и наследование.


 
DVM ©   (2014-02-26 00:30) [216]


> жена полковника Вагина   (26.02.14 00:23) [214]


> и обе реализации СделайМнеХорошо() не имеют никакого отношения
> ни к вирутальнотсти ни к наследованию.

Еще раз повторюсь. Такая конструкция - это фишка конкретно делфи. Думай об интерфейсах как об абстрактных классах. В Delphi 2 не было интерфейсов, но COM как то поддерживалось, просто использовали абстрактные классы с виртуальными методами.


 
vuk ©   (2014-02-26 00:34) [217]

to DVM ©   (26.02.14 00:24) [215]:

> В документации на Visual Basic такой способ полиморфизма
> не отражен:

Ну, это таки vbscript. Там интерфейсов нет. Наследования тоже. :)


 
big_djo ©   (2014-02-26 00:38) [218]

-->Дело в том, что никакого динамического полиморфизма не существует.

Динамический полиморфизм предстает перед нами в форме классов с виртуальными функциями и объектов, работа с которыми осуществляется косвенно — через указатели или ссылки. Статический полиморфизм включает шаблоны классов и функций.

Взято отсюда http://insidecpp.ru/books/cpp_coding_standards/
Не думаю что у Герба Саттера и  Андрея Александреску квалификация ниже вашей и они не правы в своих завявлениях насчет динамического полиморфизма


 
Юрий Зотов ©   (2014-02-26 00:41) [219]

> big_djo ©   (26.02.14 00:22) [213]

> Любое определение хромает
К счастью, не любое.

как выяснилось в данной теме не все так считают
Еще раз: то, о чем Вы говорите называется просто полиморфизмом. И так считают все, кто вообще понимает, что такое полиморфизм.

> Для публикации рецензия не требовалась
Более чем прискорбно.

> В целом есть недочеты
Это не недочеты. Это незнание даже основ того, чему Вы пытаетесь учить.

> но я их поправлю
Боже Вас упаси. Поберегите лес - он стоит дороже макулатуры.

> считаю что простые вещи могу донести до студентов.
Посоветуйте им книгу Тейксейры и Пачеко. Это лучшее, что Вы можете для них сделать.


 
DVM ©   (2014-02-26 00:41) [220]


> big_djo ©   (26.02.14 00:38) [218]

Я тоже всегда считал, что полиморфизм бывает динамический и статический (хотя это не совсем полиморфизм на мой взгляд).


 
ухты   (2014-02-26 00:44) [221]


> Статический полиморфизм включает шаблоны классов и функций.
Еще называют параметрическим (дженерики сюда относят).


 
big_djo ©   (2014-02-26 00:50) [222]

-->Это не недочеты. Это незнание даже основ того, чему Вы пытаетесь
-->учить.
Это Ваше мнение, я не претендую на его изменение

-->Боже Вас упаси. Поберегите лес - он стоит дороже макулатуры.
не хочу беречь лес)))

-->Посоветуйте им книгу Тейксейры и Пачеко. Это лучшее, что Вы можете
-->для них сделать.
А вот к этому замечанию прислушаюсь! Я не читал Пачеко к сожалению, я рекомендую студентам книжку Тома Свана "Библия Делфи", на мой взгляд очень хорошая


 
Юрий Зотов ©   (2014-02-26 00:56) [223]

> big_djo ©   (26.02.14 00:38) [218]

Вы сами сказали, что речь идет о Delphi 7. Где Вы в Delphi 7 нашли шаблоны классов и функций?


 
big_djo ©   (2014-02-26 01:01) [224]

-->Вы сами сказали, что речь идет о Delphi 7. Где Вы в Delphi 7 нашли
-->шаблоны классов и функций?

То есть теперь напопятную? прицепляемся к языку программирования?)))


 
Компромисс1 ©   (2014-02-26 01:21) [225]

DVM ©   (26.02.14 00:30) [216]

Еще раз повторюсь. Такая конструкция - это фишка конкретно делфи. Думай об интерфейсах как об абстрактных классах.

Э, нет. Эта "фишка" присутствует в Java, Flex и наверняка еще в куче языков. Я бы скорее назвал фишкой вынужденное использование абстрактные классов, у которых все методы абстрактные, в тех языках, где нет интерфейсов.


 
Юрий Зотов ©   (2014-02-26 01:23) [226]

> big_djo ©   (26.02.14 01:01) [224]

При чем тут "прицепляемся"? Не я, а Вы сами обозначили сабж, вот о нем я и говорю.

А Вы как хотели - сразу обо всем, что ли? Это равносильно "ни о чем".


 
Компромисс1 ©   (2014-02-26 01:33) [227]

Кстати, динамический полиморфизм таки существует.

http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)


 
Константин   (2014-02-26 06:11) [228]

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


 
Ega23 ©   (2014-02-26 08:23) [229]

Тема - огонь.


 
clickmaker ©   (2014-02-26 09:01) [230]

вот еще одна реализация полиморфизма. Это динамический или статический?
var assembly = Assembly.GetExecutingAssembly();
var type = assembly.GetType(string.Format("SomeNamespace.{0}", _dictionary.Name));
var method = type.GetMethod("GetDefaultView");
var dv = method.Invoke(null, new object[]{_parentId}) as DataView;


 
имя   (2014-02-26 09:05) [231]

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


 
Inovet ©   (2014-02-26 09:08) [232]

> [230] clickmaker ©   (26.02.14 09:01)

Ну я ещё на Радио РК-86 на асм 8080 делал полиморфизм, только я тогда не знал такого слова, и не знаю какой он был. Но функции были виртуальные, вызывались в зависимости от типа объекта, ага, по таблице указателей на функции.


 
Inovet ©   (2014-02-26 09:11) [233]

> [232] Inovet ©   (26.02.14 09:08)
> Радио РК-86

Эээ, Радио-86РК.
http://ru.wikipedia.org/wiki/%D0%E0%E4%E8%EE_86%D0%CA


 
clickmaker ©   (2014-02-26 09:53) [234]

> не можешь задекларировать в коде полиморфность.

//Нет полиморфности
TCar = class
procedure startengine;
end;

TBmw = class(TCar)
procedure startengine;
end;

var car: TCar;
car := TBmw.Create;
car.startengine;

//Есть полиморфность
TCar = class
procedure startengine; virtual;
end;

TBmw = class(TCar)
procedure startengine; override;
end;

var car: TCar;
car := TBmw.Create;
car.startengine;


 
имя   (2014-02-26 10:12) [235]

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


 
DVM ©   (2014-02-26 10:19) [236]

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


 
clickmaker ©   (2014-02-26 10:22) [237]

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


 
имя   (2014-02-26 10:27) [238]

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


 
имя   (2014-02-26 10:30) [239]

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


 
clickmaker ©   (2014-02-26 10:34) [240]

> то нахрена мне кастомные процедуры заводки если они одинаковые
> и реализованы в базовом классе?

а причем тут полиморфизм?


 
имя   (2014-02-26 10:35) [241]

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


 
имя   (2014-02-26 10:36) [242]

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


 
DVM ©   (2014-02-26 10:36) [243]

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


 
ухты   (2014-02-26 10:46) [244]

опять медвежонка обижают :)

о чем спор, обязательно наличие virtual/override для обеспечения полиморфизма?


 
clickmaker ©   (2014-02-26 10:47) [245]

> обязательно наличие virtual/override для обеспечения полиморфизма?

если реализовывать через наследование, то да


 
zzz   (2014-02-26 10:50) [246]

Пример с бэхой у которой виртуальный старт останавливает двигло говорит что виртуальность метода на полиморфизм не влияет никак


 
vuk ©   (2014-02-26 11:05) [247]

to ухты   (26.02.14 10:46) [244]:

> о чем спор, обязательно наличие virtual/override для обеспечения
> полиморфизма?

Ну, собственно, если в реализации статического метода имеется вызов виртуального (через любое количество промежуточных), то уже, таки да, полиморфизм. Если же нет, то объекты не являются разнородными с точки зрения вызова конкретного метода.


 
icWasya ©   (2014-02-26 12:19) [248]

по поводу
grossm ©   (24.02.14 13:59) [84]

MyClass^.Field := 0;   //Ошибка! Следует писать так:
MyClass.Field := 0;

MyClass^.Field := 0; - это НЕ ошибка.
Можно писать и так и так. Более сторго - с ^. Но тогда почти весь программный код пестрел бы этими крышками. Поэтому сделали так: если тип переменной - Class или указатель на Record, то ^ перед точкой можно не писать.
Но если для какой-нибудь функции требуется параметр без типа, то тут уже важно различать - что на самом деле нужно,  адрес самой структуры или переменной в которой этот адрес записан.


 
й   (2014-02-26 13:51) [249]

> clickmaker ©   (26.02.14 09:53) [234]

//Нет полиморфности подтипов
TCar = class
procedure startengine;
end;

TBmw = class(TCar)
procedure startengine;
end;

// но есть полиморфность ситуативная (ad hoc)
TCar.Create.startengine;
TBmw.Create.startengine;


 
clickmaker ©   (2014-02-26 13:54) [250]

> есть полиморфность ситуативная

это реализация полиморфности а-ля фабрика классов. К наследованию отношения может и не иметь


 
Константин   (2014-02-26 14:11) [251]

существование полиморфности подразумевает существование мономорфности.


 
clickmaker ©   (2014-02-26 14:13) [252]

http://wikipedia.qwika.com/en2ru/Monomorphism


 
Inovet ©   (2014-02-26 14:42) [253]

> [251] Константин   (26.02.14 14:11)

и аморфности


 
ТНЕ картман   (2014-02-26 15:16) [254]

и монорхизма


 
Внук ©   (2014-02-26 17:00) [255]

>> но есть полиморфность ситуативная
 Называть в разных классах методы одинаково - это полиморфность? Вон оно чо. Охренеть.


 
vuk ©   (2014-02-26 18:12) [256]

to Внук ©   (26.02.14 17:00) [255]:

>  Называть в разных классах методы одинаково - это полиморфность?

Если это может обеспечить полиморфное поведение, то да. Оконные сообщения в винде - тоже вариант реализации полиморфизма.


> Вон оно чо. Охренеть.

Такие дела. :)


 
reonid ©   (2014-02-26 18:20) [257]

2Внук ©   (26.02.14 17:00) [255]
Думаю, в принципе, да.
Ведь статический полиморфизм - это, в частности,
перегрузка функций по типам ( function Max(a, b: Integer): Integer;  function Max(a, b: Double): Double; ),
перегрузка операторов и, в частности, одинаковые имена невиртуальных методов.

Но полиморфизм подразумевает использование одного и того же кода для разных типов,
поэтому без шаблонов всё это как полиморфизм не особо работает.
В принципе, в дельфях можно реализовать такое с помошью *.inc файлов.

Просто в Дельфи такой подход не особо практикуется, поэтому целесообразность
использования термина "статический полиморфизм" в Дельфи как-то не очевидна...


 
Внук ©   (2014-02-26 18:47) [258]

То есть если я написал класс TFoo с методом DoIt, и  Вася из Тамбова написал класс TBar с методом DoIt, то мы, не подозревая о существовании друг друга написали полиморфный код. Теория ради теории.


 
reonid ©   (2014-02-26 19:11) [259]

2Внук ©   (26.02.14 18:47) [258]
В общем случае нет.
Для статического полиморфизма важны конвенции.
Нужно, чтобы вы оба представляли, чему служит этот метод,
каким условиям он должен удовлетворять, чтобы его можно было
использовать в каком-то обобщенном коде.

ну как пример

function Test(obj: TBar): Integer;
begin
 {$I test.inc}
end;

function Test(obj: TFoo): Integer;
begin
 {$I test.inc}
end;

----test.inc----
Result := 0;
while not obj.DoIt do
 Inc(Result);


 
й   (2014-02-26 19:47) [260]

и одну из задач полиморфизма - повысить реюзабельность кода - статика таки выполняет:
//mycar := TCar.Create; // устаревшая версия - закомментирована
mycar := TBmw.Create; // новая версия
mycar.startengine; // весь остальной код таки не нужно менять!


 
й   (2014-02-26 19:49) [261]

забыл, там еще должно было быть
//var mycar: TCar; // старая
var mycar: TBmw; // yjdfz


 
clickmaker ©   (2014-02-27 10:35) [262]

> одну из задач полиморфизма - повысить реюзабельность кода

это вообще-то задача наследования


 
не жена   (2014-02-27 10:39) [263]

То есть если я написал класс TFoo с методом DoIt, и  Вася из Тамбова написал класс TBar с методом DoIt, то мы, не подозревая о существовании друг друга написали полиморфный код. Теория ради теории.

Теперь вам с васей обоим надо еще найти общего предка ваших классов с таким же методом.
так что пример не тему.


 
Внук ©   (2014-02-27 11:01) [264]

>>не жена   (27.02.14 10:39) [263]
 А что в данном конкретном случае изменит общий предок? Если методы невиртуальные, то общий предок побоку. Я ж говорю, это странная теория ради странной терминологии.


 
Внук ©   (2014-02-27 11:05) [265]

>>reonid ©   (26.02.14 19:11) [259]
 Если у нас есть с Васей конвенции, то и методы необязательно называть одинаково, достаточно соблюсти одинаковость сигнатуры, и использовать указатели, верно?


 
clickmaker ©   (2014-02-27 11:08) [266]

вообще странный спор. Если рассматривать полиморфизм как одного из трех слонов, на которых стоит ООП, то без виртуальности/переопределения тут не обойтись, хоть на уши встань.
Если же в общем случае - "единообразная обработка разнотипных данных" - то тут уже от фантазии разработчика все зависит. RTTI, дженерики, интерфейсы - все пригодится


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

Вот и я про то же. Полиморфизм, с моей точки зрения, это механизм, в первую очередь. Встроенный в язык, в компилятор.
А technics, которые используют программисты, чтобы облегчить себе жизнь, это не более, чем приемчики. Хотя и важные.


 
не жена   (2014-02-27 11:20) [268]

А что в данном конкретном случае изменит общий предок?

Прикидываемся, или на самом деле все так печально?

общий предок есть:

var v : TOбщийПредок;
begin
v := ОбъектВаси.
v.DoIt;
v := ОбъектВнука.
v.DoIt;

общий предок не есть:
var v1 : TВася;
var v2 : TВнук;
begin
v1 := ОбъектВаси.
v1.DoIt;
v2 := ОбъектВнука.
v2.DoIt;

драма второго случая :
даже если есть полиморфизм, ты делаешь вилки в коде.

вчерашний случай:

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

итог:
все есть, но вилки нужны. полиморфизмом не пахнет.

вывод:
виртуальность с полиморфизмом никак не связана.


 
не жена   (2014-02-27 11:23) [269]

А technics, которые используют программисты, чтобы облегчить себе жизнь, это не более, чем приемчики.

так полиморфизм сам по себе никому кроме разраба и нафик не уперся.
он тебе как разаработчику облегчает жизнь (если ты конечно он)


 
clickmaker ©   (2014-02-27 11:26) [270]

> полиморфизм сам по себе никому кроме разраба и нафик не
> уперся

так более того. Программизм сам по себе никому кроме разраба и нафик не нужен. Клиенту нужна кнопка "Сделать все", а остальное не беспокоит


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

>>не жена   (27.02.14 11:20) [268]
>>var v : TOбщийПредок;
>>begin
>> v := ОбъектВаси.
>> v.DoIt;
>> v := ОбъектВнука.
>> v.DoIt;

Действительно, все печально :)


 
не жена   (2014-02-27 11:29) [272]

ну не дошло так не дошло.


 
Внук ©   (2014-02-27 11:35) [273]

>>не жена   (27.02.14 11:29) [272]
Я тебя все-таки разочарую слегка. Но в вышеприведенном коде в обоих случаях будет вызываться метод
TОбщийПредок.DoIt


 
vuk ©   (2014-02-27 11:36) [274]

to clickmaker ©   (27.02.14 11:08) [266]:

> Если рассматривать полиморфизм как одного из трех слонов,
>  на которых стоит ООП, то без виртуальности/переопределения
> тут не обойтись, хоть на уши встань.

Если говорить про ООП, то виртуальность/переопределение (читай наследование реализации) вообще не является для ООП определяющим. ООП вполне может существовать без этих вещей. Что легко доказывается существованием таких объектных моделей, как COM. Или вот тот пример, что я приводил с vbscript - ни наследования ни виртуальности.

А вот инкапсуляция и полиморфизм, таки да, для ООП определяющи.


 
не жена   (2014-02-27 11:42) [275]

Я тебя все-таки разочарую слегка. Но в вышеприведенном коде в обоих случаях будет вызываться метод

Я тебя тоже.
Дуит виртуален, переопределен у тебя и у васи, вы с васей имеете общего предка, от которого и унаследован дуит.


 
Внук ©   (2014-02-27 11:43) [276]

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


 
Внук ©   (2014-02-27 11:44) [277]

Речь изначально шла про так называемый "статический полиморфизм". С невиртуальными методами.


 
И.Я. Бляблин   (2014-02-27 11:44) [278]


> драма второго случая :даже если есть полиморфизм, ты делаешь
> вилки в коде.

Проясните весь случай насчет столовых приборов, пжалста.


 
не жена   (2014-02-27 11:44) [279]

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


 
й   (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 выступает как раз в роли интерфейса, хотя явно его так не обозвали.


 
DVM ©   (2014-02-27 14:45) [321]


> ТНЕ картман   (27.02.14 14:39) [317]
> Чем длиннее ветка, тем меньше понимаю, о чем спорят))

Дык книгу обсуждаем :)


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


> big_djo ©   (27.02.14 14:43) [319]

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

Я, если честно, не очень понимаю что есть статический или динамический, применительно к полиморфизму. Но, в твоем примере я вижу реализацию полиморфизма только применительно к Test(I: Integer). А Test(S: string) не полиморфный метод. Ну не смогу я обратиться к нему из Т1...


 
И.Я. Блямблин   (2014-02-27 14:58) [323]


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

Если под интерфейсом понимается предоставление объектом свойств и методов в соответствии с каким-либо образцом, то да. Но других полиморфизмов-то и нет.
Вельми советую ознакомиться с реализацией интерфейсов в Go, и опосля - с полиморфизмом в Python


 
И.Я. Блямблин   (2014-02-27 15:11) [324]


> asail ©   (27.02.14 14:45) [320]
> > Повторю пример с vbscript. Классы есть, объекты есть,
> полиморфизм > есть, наследования нет, интерфейсов нет:Ну,
>  тут TestCall выступает как раз в роли интерфейса, хотя
> явно его так не обозвали.

Бред. Интерфейс здесь - неявно заданное соглашение о сигнатуре метода Test, но никак не TestCall, который использует это соглашение.
Собственно, ты можешь с полным правом говорить, что полиморфизм достигается с помощью задания интерфейса (правильнее называемом контрактом), которому должны следовать объекты. Задание интерфейса предком объекта, явно выделенной сущностью "интерфейс", просто соглашениями - это частные случаи реализации общего принципа.


 
Дмитрий Белькевич   (2014-02-27 15:50) [325]

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

Нет здесь полиморфизма. Перезагрузка не отменяет перекрытие, тем более что перекрытия здесь и нету (хотя могло быть, как в [319]).

>Я, если честно, не очень понимаю что есть статический или динамический, применительно к полиморфизму

Плюсую. Плодите сущности сверх необходимого.


 
Дмитрий Белькевич   (2014-02-27 16:03) [326]

Немного не в тему.

Нашел на хабре раздельчик по чистоте кода:

http://habrahabr.ru/hub/complete_code

Почитал некоторые статьи, интересно местами.

Увидел интересную программку для плюсов - статический анализатор кода PVS-Studio.

Посмотрел несколько ихних статей по этому поводу (поищите сами, сайт не даёт много ссылок в сообщении добавить)

Всё таки некоторые чисто плюсовые ошибки веселят :)

if (i = 1) вместо if (i == 1)

3 / 2 <> 1.5

находит некоторые ошибки с указателями и массивами, которые delphi в принципе не даст скомпилировать

ну и так всяко разно... есть все таки в pascal"е свои плюсы :) Паскаль дает прострелить ногу гораздо реже плюсов

Вообще - то я что-то похожее и для Delphi видел и использую - Pascal Analyzer. Он, правда, на более выскором уровне работает - межпроцедурные проблемы видит.


 
asail ©   (2014-02-27 16:09) [327]


> Если под интерфейсом понимается предоставление объектом
> свойств и методов в соответствии с каким-либо образцом,
> то да. Но других полиморфизмов-то и нет.

А что еще может пониматься под интерфейсом в ООП?
И что значит других полиморфизмов нет? В ООП, видимо, таки нет (имхо, наследование можно считать частным случаем интерфейса, в качестве которого выступает класс-предок). Но, вне ООП - есть.

> Бред. Интерфейс здесь - неявно заданное соглашение о сигнатуре
> метода Test, но никак не TestCall, который использует это
> соглашение

Да ладно? Убери у одного из классов метод Test и потом вызови TestCall для этого класса. Че получится? Пральна, опа... А почему? А потому, что данный класс не реализует в полной мере интерфейс TestCall. И разница с дельфишными интерфейсами тут чисто семантическая. А дефакто имеем два класса TestClass1 и TestClass2, реализующих интерфейс TestCall. Как ни крути...


 
сотрудник   (2014-02-27 16:19) [328]


> Дмитрий Белькевич   (27.02.14 16:03) [326]
>
> Немного не в тему.
>
> Нашел на хабре раздельчик по чистоте кода:
>
> http://habrahabr.ru/hub/complete_code

абсолютно поддерживаю! Спор о красоте и чистоте кода будет куда как более результативным, чем о какой-то там полифорфизме


 
clickmaker ©   (2014-02-27 16:25) [329]

> Всё таки некоторые чисто плюсовые ошибки веселят :)
>
> if (i = 1) вместо if (i == 1)

я уже где-то выше писал об этом.
Настоящие суровые сишники пишут так: if (1 == i) и if (false == a)


 
Inovet ©   (2014-02-27 16:28) [330]

> [329] clickmaker ©   (27.02.14 16:25)
> Настоящие суровые сишники пишут так: if (1 == i) и if (false == a)

Да ты путаешь что-то, я тоже выше тебе же и отвечал на это, про false. Может, с NULL путаешь?


 
Inovet ©   (2014-02-27 16:31) [331]

> [330] Inovet ©   (27.02.14 16:28)

А то, что в Делфи операция присвоения не возвращает результат, так это скорее недостаток языка.


 
Дмитрий Белькевич   (2014-02-27 16:31) [332]

Вот интересная статья:

использование вместо примитивных типов объектов

http://habrahabr.ru/post/205088/

Думаю - что в некоторых местах применение оправдано.

О чем еще поговорить...

Почему всегда нужно использовать FreeAndNil вместо Free

http://www.gunsmoker.ru/2009/04/freeandnil-free.html

Я уже давно придержиапюсь этой идеи. Удобно и надежно.


 
clickmaker ©   (2014-02-27 16:35) [333]

> Может, с NULL путаешь?

а какая разница?


 
Inovet ©   (2014-02-27 16:39) [334]

> [333] clickmaker ©   (27.02.14 16:35)

Разница в том, что типы разные и с false сравнивать глупо, а с NULL повышает читабельность.


 
Дмитрий Белькевич   (2014-02-27 16:39) [335]

>А то, что в Делфи операция присвоения не возвращает результат, так это скорее недостаток языка.

а что операция присвоения должна возвращать? всегда true?

Вспомнилось... чему равно 2 x 2 = 4?


 
clickmaker ©   (2014-02-27 16:41) [336]

> и с false сравнивать глупо, а с NULL повышает читабельность

if (!a) vs if (false == a) - что читабельнее?

вот в паскале и правда нет смысла, потому как if not a достаточно читабельно


 
Inovet ©   (2014-02-27 16:45) [337]

> [335] Дмитрий Белькевич   (27.02.14 16:39)
> а что операция присвоения должна возвращать? всегда true?

То, что присвоилось переменной.


 
Inovet ©   (2014-02-27 16:45) [338]

> [336] clickmaker ©   (27.02.14 16:41)
> if (!a) vs if (false == a) - что читабельнее?

Первое


 
Inovet ©   (2014-02-27 16:47) [339]

Вот, хоть от полиморфия к более традиционным холиварам перейдём.


 
Inovet ©   (2014-02-27 16:48) [340]

Да, и приоритеты в Паскале кривые. :Р


 
vuk ©   (2014-02-27 16:59) [341]

to asail ©   (27.02.14 16:09) [327]:

>  потому, что данный класс не реализует в полной мере интерфейс
> TestCall.

Неа. Думали, что утка, а оно крякать не захотело. :) В принципе, все ровно то же самое можно учинить и на Delphi, если использовать COM Automation.


 
Дмитрий Белькевич   (2014-02-27 17:05) [342]

>То, что присвоилось переменной.

Зачем?

>Вот, хоть от полиморфия к более традиционным холиварам перейдём

Ага :)


 
ухты   (2014-02-27 17:08) [343]

а почему в делфи нет возможности определять свои операторы :)


 
Inovet ©   (2014-02-27 17:11) [344]

> [342] Дмитрий Белькевич   (27.02.14 17:05)
> Зачем?

Удобно


 
Inovet ©   (2014-02-27 17:12) [345]

> [343] ухты   (27.02.14 17:08)
> а почему в делфи нет возможности определять свои операторы :)

Как, до сих пор не ввели? Непорядок.


 
И.Я. Блямблин   (2014-02-27 17:14) [346]


> Да ладно? Убери у одного из классов метод Test и потом вызови
> TestCall для этого класса. Че получится? Пральна, опа...
>  А почему? А потому, что данный класс не реализует в полной
> мере интерфейс TestCall. И разница с дельфишными интерфейсами
> тут чисто семантическая. А дефакто имеем два класса TestClass1
> и TestClass2, реализующих интерфейс TestCall. Как ни крути.
> ..

А если в коде наприсать вторую процедуру, TestCall2, то объекты у тебя внезапно начнут реализовывать интерфейс TestCall2? Потом добавим объект с методом, опять же вызывающим этт метод Test, и у нас - опа! Третий интерфейс, круто же.
А если переписать этот пример на Delphi, выделив интерфейс ITest, то получим объявление procedure TestCall(test: ITest).А ты будешь продолжать утверждать, что объекты реализуют интерфейс TestCall. Флаг в руки.


 
Дмитрий Белькевич   (2014-02-27 17:16) [347]

>Удобно

Пример?


 
Inovet ©   (2014-02-27 17:32) [348]

> [347] Дмитрий Белькевич   (27.02.14 17:16)
> Пример?

Самое простое
a = b = c = 0;

Или плохой пример, когда лучше не делать так

void f(ChoTo *p)
{
 NuzhnyiKlass *p;
 if((p = dinamic_cast<NuzhnyiKlass>(ChoTo) != NULL && p->Active())
 {
   p.Close();
 }
}

а лучше бы так

void f(ChoTo *p)
{
 NuzhnyiKlass *p = dinamic_cast<NuzhnyiKlass>(ChoTo);
 if((p != NULL && p->Active())
 {
   p.Close();
 }
}


 
Inovet ©   (2014-02-27 17:33) [349]

> [348] Inovet ©   (27.02.14 17:32)
> dinamic_cast

dynamic_cast


 
Inovet ©   (2014-02-27 17:34) [350]

> [348] Inovet ©   (27.02.14 17:32)
> <NuzhnyiKlass>

Ну и в этой фигне * добавить


 
asail ©   (2014-02-27 17:40) [351]


> А если в коде наприсать вторую процедуру, TestCall2, то
> объекты у тебя внезапно начнут реализовывать интерфейс TestCall2?

Внезапно только немцы нападают... :)
Но, впринципе да. Если этот TestCall2 будет дергать метод Test2 из обоих классов, то придется этим классам этот метод реализовывать... Хотят они того или нет.
Кстати, в дельфях точно также:
type
 IMyIntf = interface
   procedure Test;
 end;

type
 TMyClass = class(TInterfacedObject, IMyIntf)
   procedure Test;
 end;

А теперь я беру и добавляю метод Test2 в IMyIntf... И тут, также внезапно, TMyClass должен начать реализовывать этот самый Test2.
Разница с примером на vbscript, что на дельфи ошибка будет при компиляции, а не при выполнении. Я ж говорю - семантика языка...


 
И.Я. Блямблин   (2014-02-27 17:43) [352]

> Inovet ©   (27.02.14 17:32) [348]
То есть ты хочешь чтобы и в Delphi такую же запутанную фигню писать можно было?


 
asail ©   (2014-02-27 17:43) [353]


> asail ©   (27.02.14 17:40) [351]

По сути, разница только в том, что на Д в каждом классе указано, которые интерфейсы они реализуют, а в этом примере на vbscript - наоборот. Сущность TestCall указывает классы, интерфейсом которых она является...


 
asail ©   (2014-02-27 17:45) [354]


> И.Я. Блямблин   (27.02.14 17:43) [352]
> > Inovet ©   (27.02.14 17:32) [348]
> То есть ты хочешь чтобы и в Delphi такую же запутанную фигню
> писать можно было?

Да ну нафих! Чур меня!!!
[перекрестился и убежал]


 
И.Я. Блямблин   (2014-02-27 17:48) [355]


> Но, впринципе да. Если этот TestCall2 будет дергать метод
> Test2 из обоих классов, то придется этим классам этот метод
> реализовывать... Хотят они того или нет.

Ты не подгоняй реальность под свою фантазию. TestCall2 дергает тот же метод Test, что и TestCall. Может, чуть по-другому:
> class TestClass1
>   sub Test(parm)
>     WScript.Echo "TestClass1.Test" + parm
>   end sub
> end class
>
> class TestClass2
>   sub Test(parm)
>     WScript.Echo "TestClass2.Test" + parm
>   end sub
> end class
>
> sub TestCall(Instance)
>   Instance.Test("woof")
> end sub
>
> sub TestCall2(Instance)
>   Instance.Test("meow")
> end sub
>
> dim c1, c2
>
> set c1 = new TestClass1
>
> set c2 = new TestClass2
>
> TestCall(c1)
> TestCall(c2)
> TestCall2(c1)
> TestCall2(c2)

Ну-ка, какие тут интерфейсы реализованы?


 
Inovet ©   (2014-02-27 17:48) [356]

> [352] И.Я. Блямблин   (27.02.14 17:43)
> То есть ты хочешь чтобы и в Delphi такую же запутанную фигню
> писать можно было?

Чтобы не запрещали это писать.


 
Inovet ©   (2014-02-27 17:52) [357]

Да, самое главное забыл!!! Хочу, чтобы в Делфи можно было объявлять переменные везде.


 
asail ©   (2014-02-27 18:00) [358]


> Ну-ка, какие тут интерфейсы реализованы?

А оба и реализованны. Читай классы TestClass1 и TestClass2 реализуют интерфейсы TestCall и TestCall2.


 
Игорь Шевченко ©   (2014-02-27 18:02) [359]

Дмитрий Белькевич   (27.02.14 16:31) [332]

http://www.nickhodges.com/post/Using-FreeAndNil.aspx

"In my mind, the answer to the question “When should I use FreeAndNil?” is “never”"

http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil

must read

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


 
asail ©   (2014-02-27 18:02) [360]


> Inovet ©   (27.02.14 17:52) [357]
> Да, самое главное забыл!!! Хочу, чтобы в Делфи можно было
> объявлять переменные везде.

Э, батенька... Бросайте вы эту дельфю и пополняйте армию сишников, а нас попрошу не трогать! :)


 
clickmaker ©   (2014-02-27 18:06) [361]

> Хочу, чтобы в Делфи можно было объявлять переменные везде

так си-билдер вроде ж не отменили


 
Inovet ©   (2014-02-27 18:10) [362]

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


 
И.Я. Блямблин   (2014-02-27 18:10) [363]


> А оба и реализованны. Читай классы TestClass1 и TestClass2
> реализуют интерфейсы TestCall и TestCall2.

Дык эти интерфейсы совершенно идентичны! Оба содержат один метод Test.
А давай я напишу пяток методов у каждого класса и начну их в процедурах вызывать по одному-два-три, да еще в процедурах (о ужас) с разными именами? У тебя вообще получается что эти объекты реализуют бесконечное множество инетрфейсов. Именовать не замучаешься?
От того что ты обозвал процедуру интерфейсом, (о котором объекты ни сном ни духом что они его реализуют) она интерфейсом не станет. Ибо написано: процедура.
И не надо пихать дельфийский код, там как раз при изменении интерфейса меняется объект, его реализующий. А тут сколько хошь процедур пиши - объекту до этого полиморфично, код-то его остается как был.


 
asail ©   (2014-02-27 18:25) [364]


> Дык эти интерфейсы совершенно идентичны! Оба содержат один
> метод Test.

Ну и что? Хоть мульен идентичных интерфейсов будет... Никто не запрещает.
Кстати и в Д тоже:
type
 IMyIntf = interface
   procedure Test;
 end;

 IMyIntf2 = interface
   procedure Test;
 end;

 TMyClass = class(TInterfacedObject, IMyIntf, IMyIntf2)
   procedure Test;
 end;


> От того что ты обозвал процедуру интерфейсом, (о котором
> объекты ни сном ни духом что они его реализуют) она интерфейсом
> не станет. Ибо написано: процедура.

А я не виноват, что эти процедуры ведут себя именно как интерфейсы. И именно это их поведение и обеспечивает полиморфность метода Test для обоих классов (это я так, напоминаю контекст дискуссии).

> И не надо пихать дельфийский код, там как раз при изменении
> интерфейса меняется объект, его реализующий. А тут сколько
> хошь процедур пиши - объекту до этого полиморфично, код-
> то его остается как был.

Сам меняется? Не верю... :)


 
И.Я. Блямблин   (2014-02-27 18:54) [365]


> А я не виноват, что эти процедуры ведут себя именно как
> интерфейсы. И именно это их поведение и обеспечивает полиморфность
> метода Test для обоих классов (это я так, напоминаю контекст
> дискуссии).

Где ты встречал интерфейсы, которые вызывают методы? Эти сущности всегда назывались функциями.
Вот тебе еще примерчик, на питоне:
class Foo:
   def __init__(self): #constructor
       self.a = "foooo"

class Bar:
   def test(self): #method
       print(self.a)

def test(self): #function
   print(self.a)

Foo.test = test

def calltest(obj):
   obj.test()

def main():
   foo = Foo()
   bar = Bar()
   bar.a = "barrr!"
   calltest(foo)
   calltest(bar)
   test(bar)

if __name__ == "__main__":
   main()

Печатает, понятно,
foooo
barrr!
barrr!
и ищи свои интерфейсы как хочешь :)
Вот ты вбил себе в голову что у интерфейса обязательно должно быть имя, и теперь тянешь за уши реальность.


 
Дмитрий Белькевич   (2014-02-27 19:35) [366]

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

Ни разу с ним проблем не было (я бы даже сказал - на редкость). Костыль? Не знаю. Не вижу смысла параноидально следить за тем, что бы double free не было.

[348]

a := b := c := d := 0;

не знаю даже, может быть и удобно...

тогда уже лучше что-то типа:

a, b, c, d := 0;

чё уж стеняться...


 
Дмитрий Белькевич   (2014-02-27 19:41) [367]

Кстати, именно FreeAndNil помогает глюки проявлять. Вот то, что я писал выше. Я понимаю, что все мега-гуру пишут софт уровня операционок на коленке без одной ошибки. Мы вот, простые смертные программисты пишем софт с ошибками и делаем всё возможное, что бы их было как можно меньше. И, как раз, FreeAndNil этому бывает сильно помогает. Это не считая других плюшек.


 
Игорь Шевченко ©   (2014-02-27 21:27) [368]

Дмитрий Белькевич   (27.02.14 19:41) [367]


> Я понимаю, что все мега-гуру пишут софт уровня операционок
> на коленке без одной ошибки.


Мега-гуру пишут понятный код, в котором использование объектов очевидно и прозрачно. В том числе вызовы Free.


 
Rouse_ ©   (2014-02-27 21:44) [369]


> Игорь Шевченко ©   (27.02.14 21:27) [368]
> Мега-гуру пишут понятный код, в котором использование объектов
> очевидно и прозрачно. В том числе вызовы Free.

http://delphisorcery.blogspot.ru/2014/02/packages-and-initialization.html


 
Rouse_ ©   (2014-02-27 21:54) [370]


> Игорь Шевченко ©   (27.02.14 18:02) [359]
> http://www.nickhodges.com/post/Using-FreeAndNil.aspx

После этого: "Setting a pointer to nil doesn’t get you anything." читать дальше бессмысленно.


 
Romkin ©   (2014-02-27 22:22) [371]

Угумс.
“If your code requires you to use FreeAndNil to reveal and easily find bugs, then your design is wrong.  Good, clean code never feels the need to worry about errant pointers.”


 
Inovet ©   (2014-02-27 22:44) [372]

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


 
Kerk ©   (2014-02-27 23:05) [373]


> Rouse_ ©   (27.02.14 21:44) [369]

Еще один пример кривого кода.

> Romkin ©   (27.02.14 22:22) [371]

+1
Больно смотреть на то, что людям вместо того, чтоб лишний раз подумать, проще понапихать везде FreeAndNil.


 
Rouse__   (2014-02-27 23:14) [374]

Зачем писать глупости? :) Кривой код можно найти везде - зависит от подхода. Даже goto некоторыми апологетами чистоты языка применяется. А вот по поводу думать -согласен, только думать нужно правильно, чтобы понимать что freeandneel как и free абсолютно логичные конструкции при их правильном применении


 
Kerk ©   (2014-02-27 23:18) [375]


> Rouse__   (27.02.14 23:14) [374]

Если ты забыл, то разговор не о том, допустимо ли использование FreeAndNil вообще, а о том, что идея использовать FreeAndNil всегда ничем не подкреплена и даже вредна. В очередной раз всплыла эта крайне популярная в некоторых кругах статья ГанСмокера. Но он неправ. Абсолютно.


 
Rouse__   (2014-02-27 23:19) [376]

Впрочем истинным апологетам чистоты языка советую перейти от вызова Free напрямую к Destroy - ведь зачем вам нужны излишние затраты на проверке объекта с nil


 
Kerk ©   (2014-02-27 23:20) [377]

Но вообще все эти разговоры про FreeAndNil поднадоели. Люди делятся на два типа: тех, кто знает о FreeAndNil и тех, кто пользуется ей всегда и всем советует. Это уже утомляет :)

Вот здесь я по этому поводу недавно высказывался, добавить нечего, ничего нового не придумал
http://programmingmindstream.blogspot.ru/2014/01/freeandnil.html?showComment=1389850400770#c8979317681113318928


 
Rouse__   (2014-02-27 23:22) [378]

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


 
Kerk ©   (2014-02-27 23:28) [379]


>  Rouse__   (27.02.14 23:19) [376]
>
> Впрочем истинным апологетам чистоты языка советую перейти
> от вызова Free напрямую к Destroy - ведь зачем вам нужны
> излишние затраты на проверке объекта с nil

А вот это как раз легко объяснить:
 TTestClass = class
 private
   FList: TStringList;
 public
   constructor Create;
   destructor Destroy; override;
 end;

constructor TTestClass.Create;
begin
 raise Exception.Create("Error Message");
 FList := TStringList.Create;
end;

destructor TTestClass.Destroy;
begin
 FList.Destroy;
 inherited;
end;


При попытке создания этого класса будет 2 эксепшена. А если Destroy заменить на Free, то только один.


 
Дмитрий Белькевич   (2014-02-27 23:38) [380]

>Ну мы же взрослые люди, не будем пытаться закрывать уши ладошками и зажмуриваться вместо того, чтобы честно поймать свой эксепшен и НА САМОМ ДЕЛЕ РЕШИТЬ ПРОБЛЕМУ

Не знаю, почему FreeAndNil выдаётся за сокрытие экцепшнов. Они мне как раз помогают исключения "проявлять". Без них иногда случались обращения к разрушенным объектам (что, понятно, абсолютное зло). А вот с ними к разрушенным объектам обращаться не получается - потому как появляется AV, что и нужно.


 
ухты   (2014-02-27 23:38) [381]

FreeAndNil такаяже процедура как и другие, чего в ней такого не такого?
так на любую можно наскочить и заклевать...


 
Дмитрий Белькевич   (2014-02-27 23:48) [382]

>FreeAndNil такаяже процедура как и другие, чего в ней такого не такого?

Холивары они такие - бессмысленные и беспощадные :)


 
Rouse__   (2014-02-27 23:48) [383]

Ром - это не чистый код, тыж сам чуть выше дал камент про кривой код :)


 
ухты   (2014-02-27 23:49) [384]

особенно assign, вот уж где странные процедуры :)


 
картман ©   (2014-02-27 23:58) [385]


> Kerk ©   (27.02.14 23:20) [377]
> http://programmingmindstream.blogspot.ru/2014/01/freeandnil.
> html?showComment=1389850400770#c8979317681113318928

статья с надрывом


 
Компромисс1 ©   (2014-02-28 00:02) [386]

Интересный спор.
FreeAndNil прячет ошибки повторного вызова деструктора, Free прячет ошибки обращения к уже удаленному объекта, Destroy не работает при исключении в конструкторе.
По-моему, оптимальным будет использование Free в деструкторе для удаления полей, и CheckedFreeAndNil (новый метод, который выдает исключение при nil параметре, иначе вызывая FreeAndNil) для всех остальных случаев.
Получим, что и поля нормально освобождаются, и все исключения видим.
Код типа
try
 obj := MyClass.Create;
 ...
finally
 obj.Free
end;


придется переделать на правильный код

obj := MyClass.Create;
try
 ...
finally
 CheckedFreeAndNil(obj);
end;


 
Дмитрий СС   (2014-02-28 01:56) [387]


> Компромисс1 ©   (28.02.14 00:02) [386]

Я первый код иногда использую, обNILивая переменные до try. Получается компактнее, если нужно создавать много объектов в методе.

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


 
Inovet ©   (2014-02-28 09:40) [388]

> [387] Дмитрий СС   (28.02.14 01:56)
> Плохо что нет никакой директивы, которая бы обнуляла все
> локальные переменные перед вызовом - так было бы вдвое удобнее.

Это было бы накладно, лучше самому по необходимости присвоить нужное значение.


 
Inovet ©   (2014-02-28 09:42) [389]

> [387] Дмитрий СС   (28.02.14 01:56)
> Я первый код иногда использую, обNILивая переменные до try

Где в первом коде обниливание?


 
clickmaker ©   (2014-02-28 09:45) [390]

> CheckedFreeAndNil (новый метод, который выдает исключение
> при nil параметре

при nil параметре мы и так получим исключение выше, при 1-м обращении к объекту


 
ухты   (2014-02-28 10:17) [391]

даже в FreeAndNil есть полиморфизм, или опять не правильно?


 
clickmaker ©   (2014-02-28 10:18) [392]

> даже в FreeAndNil есть полиморфизм

он есть и IRL и даже на форумах ДМ


 
Romkin ©   (2014-02-28 13:47) [393]

По поводу кода на VBS из [316]:
вполне переписывается на Delphi и без всяких сом (и интерфейсов):
program TestDisp;

{$APPTYPE CONSOLE}

uses
 SysUtils;

const
 M_TEST = $0001;

type
 TestClass1 = class
 public
   procedure Test(var Message: word); message M_TEST;
 end;

 TestClass2 = class
 public
   procedure Test(var Message: word); message M_TEST;
 end;

{ TestClass1 }

procedure TestClass1.Test(var Message: word);
begin
 writeln("TestClass1.Test");
end;

{ TestClass2 }

procedure TestClass2.Test(var Message: word);
begin
 writeln("TestClass2.Test");
end;

procedure TestCall(Instance: TObject);
var
 msg: word;
begin
 msg := M_TEST;
 Instance.Dispatch(msg);
end;

var
 c1, c2: TObject;

begin
 c1 := TestClass1.Create();
 c2 := TestClass2.Create();
 TestCall(c1);
 TestCall(c2);
 c1.Free;
 c2.Free;
 readln;
end.


 
vuk ©   (2014-02-28 14:13) [394]

to Romkin ©   (28.02.14 13:47) [393]:

> вполне переписывается на Delphi и без всяких сом (и интерфейсов):

Я, собственно, уже писал тут, что обмен сообщениями и их обработка (да хоть в той же винде) тоже является способом реализации полиморфизма. А здесь использована именно что методика обработки сообщений.

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

И да. методы, привязанные к оконным сообщениям появились еще в Borland Pascal. И модификатор тогда записывался в виде virtual MSG_ID Што кагбэ намекает. :)


 
все она же   (2014-02-28 15:26) [395]

Удалено модератором
Примечание: http://delphimaster.ru/forums.shtml#rule Запрещается: п.8


 
Компромисс1 ©   (2014-02-28 17:24) [396]


> при nil параметре мы и так получим исключение выше, при
> 1-м обращении к объекту


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


 
icWasya ©   (2014-02-28 17:40) [397]

>Компромисс1 ©   (28.02.14 00:02) [386]
>FreeAndNil прячет ошибки повторного вызова деструктора, Free прячет ошибки обращения к уже удаленному объекта, Destroy не работает при исключении в конструкторе.
-------------------------------------
Не совсем (или даже совсем не) так.
1) при исключении в конструкторе Destroy вызовется сам.

2) Free НЕ прячет ошибки обращения к уже удаленному объекта.
  Если объект разрушить (через Destroy или Free), но не обнулиь ссылку, то при ЛЮБОМ обращении получется неопределённое поведение (UB), которое частенько бывает трудно обнаружить. И никакой CheckedFreeAndNil тут не поможет.

3) FreeAndNil гарантирует, что после разрушения объекта ссылка на него чесно будет равна nil, и поэтому при обращении к объекту по этой ссылке вызовет гарантированый Acsess violation.

Естественно всё это работает, только если на объект есть только одна ссылка.

p.s. -В С++ delete нулевого указателя то же не приводит к ошибке.


 
Компромисс1 ©   (2014-02-28 18:24) [398]

icWasya ©   (28.02.14 17:40) [397]

Я именно об этом и писал - после вызова Free не всегда удается обнаружить обращения к уже удаленному обьекту, поэтому нужно обнуление.
Destroy после ошибки в конструкторе вызовется сам, но destroy полей (членов) сам не вызовется, поэтому в деструкторе придется писать myInnerObjectMember.Free или FreeAndNil(myInnerObjectMember).


 
Дмитрий Белькевич   (2014-02-28 23:40) [399]

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

Дело, конечно, каждого, но лично я не считаю multiple free ошибкой (при использовании FreeAndNil, само собой). Проверится, один раз разрушится, больше - нет.

Не вижу минусов в попытке повторного разрушения. Если кому-то такой подход кажется не достаточно чистым - в [386] хорошее решение, как говорится - и нашим и вашим :)

В CheckedFreeAndNil можно поднять исключение о multiple free. Кстати говоря - от multiple free использование free тоже не спасает. То есть free - наихудшее решение, не позволяющее обнаружить ни multiple free ни доступ к уже разрушенным объектам. Мне решение в 386 очень нравится, однако использовать не буду, пока устраивает freeandnil. И так знаю, что у меня в некоторых местах есть multiple free by desing.



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

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

Наверх





Память: 1.66 MB
Время: 0.018 c
2-1382695991
JohnKorsh
2013-10-25 14:13
2014.10.05
Обработка исключений


15-1387389158
wl
2013-12-18 21:52
2014.10.05
Перевод с японского.


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


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


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский