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

Вниз

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

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

Наверх




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


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


2-1382614616
qwerty123
2013-10-24 15:36
2014.10.05
ListView


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


15-1393360202
Юрий
2014-02-26 00:30
2014.10.05
С днем рождения ! 26 февраля 2014 среда