Форум: "Прочее";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизФилосовский вопрос Найти похожие ветки
← →
Ega23 © (2008-05-13 20:43) [0]А зачм в Delphi нужна директива abstract? В чём её прелесть? Почему не сделать виртуальный метод с пустым телом в базовом классе, как это в TDataLink сделано?
← →
-Koha (2008-05-13 20:45) [1]
> Ega23 © (13.05.08 20:43)
С..с..с..с..! - однозначно военная тайна.
← →
Юрий Зотов © (2008-05-13 20:47) [2]Например, чтобы ОБЯЗАТЬ потомков перекрывать этот метод (потому что с пустым методом класс неработоспособен), а компилятор получил возможность ругаться на неперекрытый метод.
← →
Ega23 © (2008-05-13 20:48) [3]
> С..с..с..с..! - однозначно военная тайна.
Не, серьёзно. Абстрактный класс в Delphi оздать можно. При переопределении абстрактного метода по Ctrl + Shift + C эта сволочь inherited автоматом ставит и если забудешь убрать - abstract error
Одни расстройства...
← →
Ega23 © (2008-05-13 20:50) [4]
> Например, чтобы ОБЯЗАТЬ потомков перекрывать этот метод
> (потому что с пустым методом класс неработоспособен), а
> компилятор получил возможность ругаться на неперекрытый
> метод.
А зачем? Юр, ну вот реальный пример приведи? Я серьёзно не понимаю, в чём такая офигенная польза.
← →
Джо © (2008-05-13 20:55) [5]> [4] Ega23 © (13.05.08 20:50)
> А зачем? Юр, ну вот реальный пример приведи? Я серьёзно
> не понимаю, в чём такая офигенная польза.
Ну, например, разработал я базовый интерфейс (абстрактный класс) и отдал его сотруднику, чтобы плодил он потомков по образу и подобию. Если не реализует какой-то из методов, коий обязательно должен быть реализован — компилятор ему быстро об этом напомнит :) Примерно так.
← →
Palladin © (2008-05-13 20:57) [6]
> Ega23 © (13.05.08 20:50) [4]
реальный? :) обостренная болезнь создать экземпляр TStrings :)
задумайся
← →
Ega23 © (2008-05-13 20:58) [7]
> Ну, например, разработал я базовый интерфейс (абстрактный
> класс) и отдал его сотруднику, чтобы плодил он потомков
> по образу и подобию. Если не реализует какой-то из методов,
> коий обязательно должен быть реализован — компилятор ему
> быстро об этом напомнит :) Примерно так.
Тогда уж проще действительно интерфейс объявить, без реализации его методов ты и не скомпилируешься...
← →
Ega23 © (2008-05-13 21:00) [8]
> реальный? :) обостренная болезнь создать экземпляр TStrings :)
> задумайся
А чё задумываться? Я же говорю, я бы не задавал вопросов, если бы в Delphi отсутствовала возможность создания абстрактного класса. Но она же есть! И как раз из-за неё все эти болезни по созданию TStrings
← →
Юрий Зотов © (2008-05-13 21:02) [9]> Ega23 © (13.05.08 20:50) [4]
type
TAnyFigure = class(...)
...
public
procedure Draw; virtual; abstract;
...
end;
TCircle = class(TAnyFigure)
...
public
procedure Draw; override; // Рисует круг
...
end;
TRectangle = class(TAnyFigure)
...
public
procedure Draw; override; // Рисует прямоугольник
...
end;
Если метод Draw абстрактный и программист забыл его перекрыть, то он получит вразумительный Abstract Error.
Если же метод Draw сделать пустым и программист забудет его перекрыть, то он будет ломать голову, почему это у него ничего не рисуется.
Это простой пример. Программист увидит, что ничего не рисуется и быстро поймет в чем дело. Но что было бы, если бы метод выполнял НЕвизуальную работу? Это ж еще обнаружить надо, что она не выполняется.
← →
Джо © (2008-05-13 21:05) [10]> [7] Ega23 © (13.05.08 20:58)
> Тогда уж проще действительно интерфейс объявить, без реализации
> его методов ты и не скомпилируешься...
Проще или нет — это только от задачи зависит. Вот (несколько надуманный) пример:TDataProcessor = class
protected
function GetSource: string; virtual; abstract;
procedure Process;
end;
...
procedure TDataProcessor.Process;
begin
...
DoSomething (GetSource());
...
end;
Здесь в базовом классе уже заложена некая базовая функциональность. Потомки обязаны реализовать некоторые специфичные методы (в данном случае GetSource). Если таковых методов немало — то очень удобно, что компилятор сам проконтролирует их реализацию.
← →
Юрий Зотов © (2008-05-13 21:07) [11]> Ega23 © (13.05.08 20:58) [7]
> Тогда уж проще действительно интерфейс объявить, без реализации
> его методов ты и не скомпилируешься...
1. Но тогда придется реализовывать ВСЕ, а не один метод. Зачем?
2. Абстрактные методы в Delphi появились раньше интерфейсов.
← →
Palladin © (2008-05-13 21:07) [12]
> Ega23 © (13.05.08 21:00) [8]
Ладно, по аналогии с Юрием
TCommandClass=Class of TCommand;
TCommand=Class
Public
Constructor... ; Virtual;
Procedure Execute; Virtual; Abstract;
и далее наследники с перекрытием... пользователи могут создавать класс по ссылке и вызывать Execute
← →
Игорь Шевченко © (2008-05-13 21:09) [13]ну вот уже и про ТStrings сказали :)
> Почему не сделать виртуальный метод с пустым телом в базовом
> классе
Это хорошо, если ничего не рисует, это не страшно. Гораздо хуже, если ничего не считает :) Например долгов...
← →
-koha (2008-05-13 21:14) [14]Товарищ. > Ega23 © утверждал, что если бы этого метода небыло, то и траблов бы небыло, следовательно
> Если метод Draw абстрактный и программист забыл его перекрыть, то он получит вразумительный Abstract Error.
> Если же метод Draw сделать пустым и программист забудет его перекрыть, то он будет ломать голову, почему это у него ничего не рисуется.
- несуществующие методы выполняться не могут.
До сих пор так и не нашел ни одного преимущества перед классами. классы это зло!
← →
Юрий Зотов © (2008-05-13 21:27) [15]А еще - "Мартышка и очки".
← →
Пробегал2... (2008-05-13 22:01) [16]По-моему, было бы логичнее, если бы компилятор не позволял создавать экземпляры классов с методами, объявленными как абстрактные.
То есть, это была бы ошибка компиляции, а не исполнения.
← →
Слоник © (2008-05-13 22:03) [17]а если метод вернуть что-то должен, int Count, например? что возвращать? 0? -1?
если объект? null? инстанс с дефолтным конструктором?
а если надо вернуть другой абстрактный класс или интерфейс, то создаём первый попавшийся - и в путь?
за null в не внутренних методах и методах типа T Find(id) бью по рукам (обоснованные исключения, конечно, возможны)
есть такое чудесное правило - "не умеешь? не берись", так и тут.
если без понятия, что делать в методе - честно признайся в этом, кинь исключение
а abstact - это по сути то же исключение, только на уровне компиляции
пс. простите за до-диезность =)
← →
Юрий Зотов © (2008-05-13 22:47) [18]> Пробегал2... (13.05.08 22:01) [16]
На этапе компиляции выдается предупреждение, что нормально. Поскольку если абстрактный метод реально кодом не юзается, то и потомков плодить ни к чему.
> Слоник © (13.05.08 22:03) [17]
Ниасилил. Моя си-бемольность не догоняет.
← →
Слоник © (2008-05-13 22:55) [19]Юрий Зотов, на малую терцию выше берите ;)
← →
guav © (2008-05-13 23:22) [20]Ну вот просто так в Delphi сложилось и всё, не надо искать логику там где её нет.
Вот в C++ абстракность работает именно на этапе компиляции, класс с абстрактными методами не создаётся. И возможен вызов абстракного метода базового класса из наследника, если этот абстрактный метод реализован в базе. Но там зато синтаксис нелогичный.
← →
-koha (2008-05-14 00:04) [21]А как насчет "слона в посудной лавке" модуль classes где то 80 кб прибавляет SysUtils + 45
можно вообще все выкинуть и оставить только system и что с ним идет и еще модуль windows.
Предлагаю пример поискового модуля файлов по расширению размер 24 кб в упакованном виде 12 кб
к тому же выполняется многопоточностью поиска и ожидание завершения всех потоков с подсчетом времени выполнения
Т.е. поиск идет на всех дисках одновременно.
Вот пример + исходники http://webfile.ru/1942995
Правда результат отправляется в отдельное окно утилиты MSGLoger.exe http://webfile.ru/1942985
← →
Игорь Шевченко © (2008-05-14 00:09) [22]
> Предлагаю пример поискового модуля файлов по расширению
dir в Windows отменили ? Или у тебя для линукс ? Так там ls есть
← →
Ega23 © (2008-05-14 00:14) [23]
> А как насчет "слона в посудной лавке" модуль classes где
> то 80 кб прибавляет SysUtils + 45
А какое это имеет отношение к абстрактным методам?
← →
-koha (2008-05-14 00:16) [24]Это же только пример.
А в своих программах вы пользователей тоже просите в консоли ковыряться?
это же просто демо - пример......
← →
-koha (2008-05-14 00:18) [25]
> Ega23 © (14.05.08 00:14) [23]
>
>
> > А как насчет "слона в посудной лавке" модуль classes где
> > то 80 кб прибавляет SysUtils + 45
>
>
> А какое это имеет отношение к абстрактным методам?
это имеет отношение к классам, если нет классов - нет абстрактных методов..
← →
Игорь Шевченко © (2008-05-14 00:21) [26]
> А в своих программах вы пользователей тоже просите в консоли
> ковыряться?
Мы рекдо пишем программы, которые делают то, что уже давно сделано, вот в чем наша беда.
← →
Игорь Шевченко © (2008-05-14 00:21) [27]
> это имеет отношение к классам, если нет классов - нет абстрактных
> методов..
Обратное также неверно
← →
Юрий Зотов © (2008-05-14 00:24) [28]Точно - мартышка и очки.
Дружище, лабать на API простенькие утилитки - это для юных пионэров, чтоб пальцы перед друзьями погнуть.
Ты большую программу таким образом напиши. С кучей окон, кнопок и прочего GUI.
Пока будешь писать - состаришься. А за это время поймешь, что прибавка даже и нескольких метров - это очень маленькая плата.
← →
Ketmar © (2008-05-14 00:26) [29]> -koha (14.05.08 00:04) [21]
предлагаю однострочник в пару десятков байт:
find ~ -name "myfile.txt"
ну, и man find, чтобы понять, что гуёвые искалки после перекура в углу самоубиваются от стыда.
← →
Ketmar © (2008-05-14 00:27) [30]> Юрий Зотов © (14.05.08 00:24) [28]
это вообще не плата. вот, для некоторого софта весь JRE тащить надо, и ничего — используют.
← →
Тимохов (2008-05-14 00:28) [31]ты еще спроси, что современный дельфи имеет такую-же директиву для класса!!!!
только вот она не работает не фига
← →
Юрий Зотов © (2008-05-14 00:32) [32]> Ketmar © (14.05.08 00:27) [30]
Я от ее прожорливости тащщусь просто. Сделали программу - метров на 100 тянет (плюс VM). То же самое на Delphi метров в 5 уложилось бы, и без всяких VM.
← →
Ketmar © (2008-05-14 00:33) [33]> -koha (14.05.08 00:16) [24]
> Это же только пример.А в своих программах вы пользователей
> тоже просите в консоли ковыряться?
кстати, пользователь вообще ни о каких «файлах» знать не должен. пользователю файлы без нужды. и то, что ему это до сих пор показывают — архаичный костыль в юзабилити.
← →
Ketmar © (2008-05-14 00:35) [34]> Юрий Зотов © (14.05.08 00:32) [32]
дык не ты один. но это ж Ынтыпрайз, всё должно быть солидно. а разве может быть солидной программа в какие-то жалкие несколько метров? да ещё и память не жрущая? это ж как тогда объяснишь, зачем надо многомоторные сервера со штабелями памяти покупать?
зыж аднака, говорят, что жабка зато портабельна. я в ней не спец (так, игрался), но слабо верю, что конкретное решение без изменений поедет и на винде, и на линуксе, например. всё равно примажется что-то платформозависимое ведь. да хоть MS SQL, не к ночи будь помянут.
← →
-koha (2008-05-14 00:44) [35]Нам пищнэрам нечего писать проги в несколько мегатон с гуевой тучей окон, диалогов и прочих не потребностей. Из этой мелкой искалки может выйти классная затиралка.. ;-) , а если ее еще и на асме перекодить, то выйдет еще менше и лучше. Нам пионЭрам другие качества подходят, чем мельче тем лучше. Вот вам и философия когда количественное перетекает в качественное.
← →
Anatoly Podgoretsky © (2008-05-14 00:45) [36]> Ketmar (14.05.2008 00:35:34) [34]
С платами по два террабайта.
← →
Германн © (2008-05-14 00:48) [37]
> -koha (14.05.08 00:44) [35]
>
> Нам пищнэрам нечего писать проги в несколько мегатон с гуевой
> тучей окон, диалогов и прочих не потребностей. Из этой мелкой
> искалки может выйти классная затиралка.. ;-) , а если ее
> еще и на асме перекодить, то выйдет еще менше и лучше. Нам
> пионЭрам другие качества подходят, чем мельче тем лучше.
> Вот вам и философия когда количественное перетекает в качественное.
>
>
Не. Это философия перетекания количества в посредственное. А классную затиралку нафиг.
← →
Германн © (2008-05-14 00:50) [38]
> -koha (14.05.08 00:04) [21]
И вообще у тебя философия "без". Работа без "вышки", программы без классов. Что у тебя ещё Без?
← →
Ketmar © (2008-05-14 00:51) [39]> -koha (14.05.08 00:44) [35]
а если изначально микрокомпьютер с этой функцией спроектиорвать, то вообще один опкод будет.
← →
-koha (2008-05-14 01:02) [40]
> Германн © (14.05.08 00:50) [38]
>
>
> > -koha (14.05.08 00:04) [21]
>
> И вообще у тебя философия "без". Работа без "вышки", программы
> без классов. Что у тебя ещё Без?
У меня еще "Без" денег...
А если по рассуждать, вы в классах создаете методы, а разве нельзя их просто переместить в процедуры и функции в отдельные модули и вызывать не классах,
стоит ли создавать промежуточный класс его пере наследовать, только для того чтобы добавить пару методов, которые можно было бы заменить обычными процедурами функциями лежащими в модуле?
Страницы: 1 2 3 4 5 вся ветка
Форум: "Прочее";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.042 c