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-е, обладает счетчиком ссылок, обнуление которого и есть причина для удаления. Которое происходит сразу же, без раздумья
В общем, ref-counting, вместо сборки мусора. Классы в локальных переменных отслеживаются корректно - уничтожаются (в смысле - уменьшается счетчик ссылок) по выходу. Даже если мимо пролетает исключение (за возможность которого ты ни сном ни духом) - перехватит, и обработает (та еще история, между прочим...)
В какой это версии Delphi вдруг классы обзавелись счётчиками ссылок?

Автор:  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троки - со счётчиками, интерфейсы тоже, но не классы
Вынужден согласиться :shock:
ВЫ ПРАВЫ. Два для подсматривал, не мог поверить... Никаких намеков на "барьер записи"
Бред какой-то. Теперь я полностью потерял веру в разум разработчиков от Бормана
Были структуры данных. И обогатили фишками ООП и получился 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

Самую малость про "устаревшее" и "теперь надо" :D
В какой последовательности в Дельфи появлялось это - не застал и не помню.
А вот FPC начинался почти полного игнорирования объектов - типа устаревшие...
У нас даже две версии KOL-а были - родной, сделанный на объектах, и портированный, сделанный на классах для FPC (v1.93, кажется)
А вот далее уже начали в FPC включать поддержку объектов по полной программе. И авторский KOL уже начал компилироваться.

Так что, кто из них "устаревший" - дискуссионный вопрос :)
Как минимум, концепция "устаревшести объектов" не прошла испытание временем в FPC

Автор:  Galkov [ Суббота, 18 Декабрь, 2010 11:08 ]
Заголовок сообщения:  Re: OBJECT и CLASS

Валерий Лаптев писал(а):
Так что не заморачивайтесь, а просто используйте то, что привычно
+1 :D

Автор:  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/