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

Вниз

Филосовский вопрос   Найти похожие ветки 

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

Наверх




Память: 0.58 MB
Время: 0.021 c
15-1210851293
Marij
2008-05-15 15:34
2008.06.29
PageControl


15-1210944131
ekto
2008-05-16 17:22
2008.06.29
Оформление кода


3-1200909104
Karburator
2008-01-21 12:51
2008.06.29
отвязать DBLookupCombobox от управляющего ДатаСурса


2-1212521913
alex-drob
2008-06-03 23:38
2008.06.29
налажение памяти в структуре с динамическим масивом


3-1201011542
Olegus
2008-01-22 17:19
2008.06.29
ParamByName