OberonCore https://forum.oberoncore.ru/ |
|
OBJECT и CLASS https://forum.oberoncore.ru/viewtopic.php?f=27&t=3060 |
Страница 1 из 2 |
Автор: | Madzi [ Воскресенье, 12 Декабрь, 2010 14:43 ] |
Заголовок сообщения: | OBJECT и CLASS |
Здравствуйте. Скажите пожалуйста, где можно почитать об особенностях реализации ООП в Delphi/Free pascal Интересует какой подход более эффективен (по быстродействию, по объёму кода и т.п.) Как я понимаю, сейчас есть две ветки ООП Код: pMyObject = ^tMyObject tMyObject = OBJECT CONSTRUCTOR Init (); PROCEDURE Foo (); VIRTUAL; DESTRUCTOR Done (); END; ... VAR pObj : pMyObject; tObj : tMyObject; ... BEGIN pObj := NEW (pMyObject, Init ()); tObj.Init (); ... pObj^.Foo (); tObj.Foo (); ... tObj.Done (); DISPOSE (pObj, Done ()); и второй Код: tMyClass = CLASS CONSTRUCTOR Init (); PROCEDURE Foo (); DESTRUCTOR Done (); END; ... VAR MyClass : tMyClass; ... BEGIN MyClass := tMyClass.Init (); MyClass.Foo (); MyClass.Done (); ... Как писать правильно ? ![]() |
Автор: | Борис Рюмшин [ Воскресенье, 12 Декабрь, 2010 14:55 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Слэши ставить правильно в закрывающих тегах code - поправил сообщение, чтобы отображалось нормально. |
Автор: | Александр Ильин [ Воскресенье, 12 Декабрь, 2010 15:06 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Несколько замечаний: - ключевое слово property поддерживается только для class'ов; - аналогично с interface'ами; - про поддержку конструкторов и деструкторов не помню; - все class'ы явно или неявно унаследованы от типа TObject, для object'ов общего предка нет. Посмотрите методы TObject, увидите там базовую поддержку COM. По сути, object сильно похож на Обероновские расширяемые записи. |
Автор: | Axcel [ Воскресенье, 12 Декабрь, 2010 22:08 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
На сколько я знаю, первый вариант - это для обратной совместимости, так было раньше. Сейчас Class, как правильно сказали наследник от TObject. Для создания используется конструктор: MyObj:= TMyObj.Create(), который можно переопределить. В качестве деструктора переопределяют Destroy, но прямо его не вызывают, а вызывают всегда TMyObj.free Код: TMyObj = class(TObject) constructor Create(); function Foo: boolean; destructor Destroy; override; end; ... MyObj:= TMyObj.Create(); if MyObj.Foo then ... MyObj.Free; На счет похожести на записи оберона, не согласен, и синтаксис другой и значительно более громоздкий и живут только в динамике. Насчет почитать, даже не знаю много всего, для начала наверно Архангельский подойдет. Много самых разных материалов на "Корелевстве Делфи" http://delphikingdom.com/ |
Автор: | Galkov [ Понедельник, 13 Декабрь, 2010 11:21 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Классы - это такая фиготень, которая располагается только в heap-е, обладает счетчиком ссылок, обнуление которого и есть причина для удаления. Которое происходит сразу же, без раздумья В общем, ref-counting, вместо сборки мусора. Классы в локальных переменных отслеживаются корректно - уничтожаются (в смысле - уменьшается счетчик ссылок) по выходу. Даже если мимо пролетает исключение (за возможность которого ты ни сном ни духом) - перехватит, и обработает (та еще история, между прочим...) У объекта - нифига такого нет. Просто синтаксически обагащенная структура данных (не ну vmt у нее конечно есть...). Все на ответственность программиста. Чтобы не расслаблялись ![]() Александр Ильин писал(а): ключевое слово property поддерживается только для class'ов Неправда Ваша. Весь KOL собран на Object, а уж сколько там property - и не сосчитаешь. Собственно, использовние property - ключевая фишка в KOL. Установил какой-нибудь Align := caLeft - и к обработчику сообщений пристегивается килобайтный хэндлер (скажем AlignChildrenProc). Что значит пристегивается - это труд обработчика property для объекта TControl, определенного в KOL. Ну и если никогда в твоем коде нет установок этого свойства - твой код будет на килобайт легче (магическое слово AlignChildrenProc нигде твоим кодом не цепляется) Это главный смысл KOL-а. Реализованный на объектах у который куча всяких property ![]() |
Автор: | Александр Ильин [ Понедельник, 13 Декабрь, 2010 11:48 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Galkov писал(а): Классы - это такая фиготень, которая располагается только в heap-е, обладает счетчиком ссылок, обнуление которого и есть причина для удаления. Которое происходит сразу же, без раздумья В какой это версии Delphi вдруг классы обзавелись счётчиками ссылок?
В общем, ref-counting, вместо сборки мусора. Классы в локальных переменных отслеживаются корректно - уничтожаются (в смысле - уменьшается счетчик ссылок) по выходу. Даже если мимо пролетает исключение (за возможность которого ты ни сном ни духом) - перехватит, и обработает (та еще история, между прочим...) |
Автор: | Galkov [ Понедельник, 13 Декабрь, 2010 12:01 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Не помню. В четвертой - уже точно есть. И массивы, и строки, и интерфейсы - тоже не помню когда обзавелись. |
Автор: | Александр Ильин [ Понедельник, 13 Декабрь, 2010 12:35 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Galkov писал(а): В четвертой - уже точно есть. Ничего подобного. В Delphi 7 cтроки - со счётчиками, интерфейсы тоже, но не классы. Экземпляры class'ов надо удалять вручную.
|
Автор: | Илья Ермаков [ Понедельник, 13 Декабрь, 2010 13:02 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Да-да, я тоже помню, что это только для классов, которые реализуют интерфейсы. Т.е. COM-классов. |
Автор: | Александр Шостак [ Понедельник, 13 Декабрь, 2010 13:23 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Счётчики ссылок только в строках и динамических массивах, для которых реализовано свойство copy-on-write. Вся остальная память управляется вручную. Главное отличие классов от объектов - экземпляры классы всегда динамические, поддержка Run-Time-Type-Information (что-то вроде мета-данных). Объекты помечены как устаревшие и у них отсутствует ряд полезных для Delphi вещей, таких как свойства. Про остальное вроде бы сказали. |
Автор: | Galkov [ Четверг, 16 Декабрь, 2010 11:09 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Александр Ильин писал(а): Ничего подобного. В Delphi 7 cтроки - со счётчиками, интерфейсы тоже, но не классы Вынужден согласиться ![]() ВЫ ПРАВЫ. Два для подсматривал, не мог поверить... Никаких намеков на "барьер записи" Бред какой-то. Теперь я полностью потерял веру в разум разработчиков от Бормана Были структуры данных. И обогатили фишками ООП и получился OBJECT. Вот и славненько, казалось бы. Но вот Вам новое продвижение - вводятся новые исключительно динамические сущности. И на тебе, прикол - одна из них (класс) не имеет барьера записи. За каким хреном тогда сущность по фамилии класс нужна - я полностью перестал понимать. Ибо, я тешу себя надеждой, что у нас нет противоречий на счет того, что у объекта "чего-то там нет". Все у него есть: и свойства, и наследование, и виртуалы... Ну да, чуток отличается (скажем, магическое слово override не катит, но по факту - override) от аналогичных механизмов в классах. Но вот на фига ради не очень понятных отличий городить такого монстра - понимание исчезло напрочь. Да еще и документировал бы кто эти "отличия" по человечески.... |
Автор: | Madzi [ Пятница, 17 Декабрь, 2010 22:58 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Поддерживаю, ибо тоже не понимаю. Раньше писал себе OBJECT и всё было хорошо. Теперь надо писать CLASS. А вчём отличия (кроме размещения естественно) --- непонятно. Я и OBJECT мог по факту разместить в динамической памяти, через ссылку на объект. |
Автор: | Валерий Лаптев [ Суббота, 18 Декабрь, 2010 10:53 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Это обычные косметические "улучшения" языка. Object был добавлен в ТурбрПаскаль, дай бог памяти, еще в версию 4. Это 80-е годы - когда С++ еще не был настолько популярен. С ростом популярности С++ решили в Делфях добавить более "современную" конструкцию class - под влиянием моды на С++. Аналогичные вещи происходят и в других местах. Например, в C# были generics, а потом под влиянием моды добавили template. О контейнерах я уж и не говорю - были одни контейнеры, потом добавили другие - с той же функциональностью. Так что не заморачивайтесь, а просто используйте то, что привычно. |
Автор: | Galkov [ Суббота, 18 Декабрь, 2010 11:01 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Самую малость про "устаревшее" и "теперь надо" ![]() В какой последовательности в Дельфи появлялось это - не застал и не помню. А вот FPC начинался почти полного игнорирования объектов - типа устаревшие... У нас даже две версии KOL-а были - родной, сделанный на объектах, и портированный, сделанный на классах для FPC (v1.93, кажется) А вот далее уже начали в FPC включать поддержку объектов по полной программе. И авторский KOL уже начал компилироваться. Так что, кто из них "устаревший" - дискуссионный вопрос ![]() Как минимум, концепция "устаревшести объектов" не прошла испытание временем в FPC |
Автор: | Galkov [ Суббота, 18 Декабрь, 2010 11:08 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Валерий Лаптев писал(а): Так что не заморачивайтесь, а просто используйте то, что привычно +1 ![]() |
Автор: | Alexey Veselovsky [ Суббота, 18 Декабрь, 2010 11:21 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Galkov писал(а): Так что, кто из них "устаревший" - дискуссионный вопрос ![]() Как минимум, концепция "устаревшести объектов" не прошла испытание временем в FPC Они просто добивались полной обратной совместимости с делфи. Не поддержав Object этого не добиться, вот и всё. |
Автор: | Galkov [ Суббота, 18 Декабрь, 2010 11:25 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
И все равно не добились ![]() А на результирующий код смотреть (сравнить с дельфячим) без слез невозможно |
Автор: | Alexey Veselovsky [ Суббота, 18 Декабрь, 2010 11:34 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Galkov писал(а): И все равно не добились ![]() А на результирующий код смотреть (сравнить с дельфячим) без слез невозможно В смысле? Помнится портировал я одну утилитку с делфи на лазарус. Собственно не портировал а пересобирал. Только контролы немного съехали, пришлось их мышкой поперетаскивать на места. Проблем небыло никаких. Т.о. код дельфячий ничем не отличался от кода fpc'ного ![]() |
Автор: | Peter Almazov [ Суббота, 18 Декабрь, 2010 15:55 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Валерий Лаптев писал(а): Например, в C# были generics, а потом под влиянием моды добавили template. Это только в Вашей голове добавили.
|
Автор: | Galkov [ Суббота, 18 Декабрь, 2010 17:08 ] |
Заголовок сообщения: | Re: OBJECT и CLASS |
Alexey Veselovsky писал(а): В смысле? По мелочам, в общем-то... Но когда наступаешь, мало никогда не кажется ![]() Предполагается бинарная совместимость в режиме -MDelphi. И она на 99% есть. А вот передача контекста во вложенных процедурах - уже не так... На асм-вставках глючит (опять же - на 1-ом проценте). Какого хрена было вообще иной регистровый интерфейс делаешь, если ставишь задачу замены - тайна сия велика есть. Ну есть еще какие-то страшные встроенные COM-слова в Дельфях, которые FPC не понимает в упор... Хотя давно не следил уже. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |