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