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

Вниз

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

 
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]
> Да, самое главное забыл!!! Хочу, чтобы в Делфи можно было
> объявлять переменные везде.

Э, батенька... Бросайте вы эту дельфю и пополняйте армию сишников, а нас попрошу не трогать! :)



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

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

Наверх





Память: 1.08 MB
Время: 0.084 c
15-1393422219
tmp
2014-02-26 17:43
2014.10.05
Железо. Совместимость шин PCIe16 и PCIe1.


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


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


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


15-1387389158
wl
2013-12-18 21:52
2014.10.05
Перевод с японского.





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