Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.56 MB
Время: 0.047 c
2-1212467689
кот
2008-06-03 08:34
2008.06.29
целое число


2-1212153367
assassin8899
2008-05-30 17:16
2008.06.29
Access


2-1212397215
C_R_U_S_H
2008-06-02 13:00
2008.06.29
Ошибка при установлении соединия ADOConnection


2-1212337033
Ceil
2008-06-01 20:17
2008.06.29
Подскажите


3-1201003179
pavel_guzhanov
2008-01-22 14:59
2008.06.29
соединение с базой Oracle





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский