Ну запугали парня...
То, что слово Class надо заменить на Object выяснено.
Нет тут ваша
БОЛЬШАЯ ошибка. Просто есть путаница мол объект это нечто общее, скажем комплексное число (Реальная часть и мнимая). И чтоб этим всем, тобишь Re и Im манипулировать как одним целым, мы для себя как программисты создаем объект. Вы скажите зачем можно писать в лоб и все такое.. можно, но я вам сейчас покажу что так легче. Во-первых нужно понимать, что когда программой будут пользоваться другие люди и извините за выражение Им наср...ть как вы там что сделали главное чтоб она работала, но вот для Вас как программиста, это имеет значение. Далее я это покажу на примере.
Так вот Объект - нечто что можна рассматривать как одно цело (объект).
Но тип определенный вами может быть Object или Class или Record. и т.п. Ну вот в C++ путанице нет у них Object или Record = Структура.. а тут просто нужно понимать в каком случае слово
Объект - это сущность (Комлпексное число, Точка, прямоугольник) а в каком случае
Объект = Object -
Тип данных, определяемый вами. Надеюсь хоть что то встало у вас на место в голове... Ну типа тоже самое про классы:
Класс комплексных чисел, и Вчера наша команда показала
Класс (Слово одно а смысл ой ой ой...).
Тоже самое и между Object и Объект..
Как мы можем его реализовать(В смысле это комплексное число то есть нечто, которое в нашем мире является априори одной сущностью, которым мы и хотим манипулировать и на языке как одним целостным объектом...)? Так мы можем это дело записать(реализовать) Минимум тремя способами:
1 - Создать Запись Record:- Код: Выделить всё
TComplexRecord = Record
Re:Real;
Im:Real;
end;
2- Cоздать Класс: Class:- Код: Выделить всё
TComplexClass = class
private
public
Re:Real;
Im:Real;
constructor Create;
destructor Destroy; override;
end;
3 - Создать Object:- Код: Выделить всё
TComplexObject = Object
Re:Real;
Im:Real;
end;
Далее мы сможем это дело использовать так (пример грубый но в самый раз для понимания):
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
CR:TComplexRecord;
CO:TComplexObject;
CC:TComplexClass;
S:String;
begin
CR.Re:=1;
S:='CR.Re='+ FloatToStr(CR.Re);
CO.Re:=2;
[b][/b]S:=S+' CO.Re='+FloatToStr(CO.Re);
CC:=TComplexClass.Create;
CC.Re:=3;
S:=S+ ' CC.Re='+FloatToStr(CC.Re);
Caption:=S;
end;
Теперь по порядку:Запись – самая простая реализация и самая быстрая!!! Именно по этому работу с комплексными числами я писал через запись
Почему быстрая потому что это кусок памяти с которым мы обращаемся как с одним целым (как с одной сущностью, что мы как раз и хотели) Теперь нас будет компилятор ругать если что то не так…
Класс- самый большой и не поворотливый, для его инициализации мы обязательно должны вызвать конструктор (всегда) потому что именно он выделит память в куче (ОЗУ) для его экземпляра. Для нашего примера, применение класса просто не оправданно, мы не используем наследование (явно) и тем более знаем что не будем порождать от комплексного числа что то еще… По этому вся мощь классов в данном примере просто лишняя, но можно делать и так.
Объект – это запись,
НО с возможностью наследования и инкапсулирования (запихивания внутрь других методов) И так же возможность создавать различные области видимости полей. (По идее это то что в Делфи называется расширенная запись, в Free Pascal есть простая запись и Объект и самое главное классы
)
Конструктор для Объектов нужен только тогда, когда будут использоваться виртуальные методы и всякая крутость… После чего он будет почти одним и тем же, что и класс,
НО с той оговоркой что он будет как и запись полностью располагаться на стеке. То есть Вы передаете экземпляр комплексного числа имеющего тип Объекта (не путать просто со словом Объект обозначающий сущность чего либо) в функцию, она функция (ну компилятор если быть точным) создаст локальную копию всего числа на стеке представьте что у вас полей не два (
Re and
Im) а скажем сотня.. вы все поля будите копировать ( ну не вы а функция не явно при каждом вызове).. Тогда когда Вы передадите такой же функции уже переменную которая явл-ся классом, то копий создано не будет, буедт лишь передан указатель на область памяти в котором лежит ваш экземпляр (конкретное число). В этом все плюсы и минусу каждого из возможных подходов к реализации через Классы или Объекты.
В данном примере который привел я, у меня для Объектов нет конструктора! Он нам не нужен, потому что мы не используем, виртуальных методов и всяких рюшек.. И в руководстве сказано, что если ничего такого нет (виртуальных методов бла бла) мы вправе не реализовывать конструктор. Что касается классов вообще, как написано в руководстве языка Free Pascal да и других скажем Delphi, конструктор должен вызываться всегда… вы захотите опровергнуть, что мол если не задать его, а сделать что то подобное:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
CC:TComplexClass;
S:String;
Begin
S:=’’;
CC.Re:=3;
S:=S+ ' CC.Re='+FloatToStr(CC.Re);
Caption:=S;
end;
То все вроде работает, Да но ходить по лезвию и пользоваться этим нельзя…
Для классов всегда нужен Конструктор и для каждого Экземпляра его нужно вызвать. Именно так и написано в руководстве по FPC.
Не могу найти описании ООП для среды FreePascal. Везде или Delphi или Lazarus.
Среды FreePascal нет! Это язык программирования такой.. он так и называется Free Pascal.
описании ООП – Это один из подходов программирования, который заключается в том что мы начинаем манипулировать не битами или цифрами, а именно объектами (отдельными сущностями) скажем кнопка… Если этого бы не было, вы бы сидели и обращаясь к видеобуферу через видеокарту и т.п рисовали эту кнопку вручную (ну я грубо, так что прошу прощения у более опытных).
По этому сущность ООП можно вообще прочитать в книгах хоть по С++.
Вот Lazarus – это среда быстрой разработки, которая работает с компилятором языка Free Pascal. По этому любая книга по Лазарусу, в ней будет описан язык ФриПаскаль, и собственно ООП для этого языка. Так же подойдет любая книга по Делфи.
Просто поймите ООП – это подход, (скажем копать яму руками или лопатой и все).Другой вопрос реализации этого подхода в языке, так вот в делфи и фрипаскале если не брать деталей все один в один, даже более того скажу в языке С++ такая же песня, там просто будут отличия в уничтожении классов при выходе из видимости переменной, автовызов конструктора и всяких рюшек….
Вам дали книгу по Паскалю, все же порекомендую
вот эту, лично ее читал, так же можно прочитать это дело в
DRKB.Теперь вообще лирика: А нафига это все нужно. Элементарный пример: берем теже самые комплексные числа, мы определим их через запись (Record), после чего мы создали наш пользовательский тип, язык фрипаскаль позволяет для типа данных переопределить стандартные функции и операторы скажем + - \ * и тп. Вплоть до exp.. – этой фигней вы будете страдать один раз при их реализации… вот мой модуль содержит почти все фунции вплоть до cosh и т.п… После чего вы можете писать что то в этом роде:
- Код: Выделить всё
Var A,b,c,d,;
Begin
A:= sqrt(exp(b+c) / d * sin(b+1312));
End;
А вот теперь напишите тоже самое, через решения в лоб
, у вас будет для каждого числа Re и Im части. Откройте любой справочник по матану, и посмотрите как реализуется скажем деление… Вы скажите но ведь когда Мы будем переопределять все это дело при перегрузке операторов и функций будем делать тоже самое. Да НО мы это делать будем один раз ОДИН.. после этого мы будем писать как нормальные люди, как в Маткаде...
Ну думаю понятно объяснил
... про классы более подробно можно прочитать в любой нормальной книге, поверте если в книге написано не понятно или сложно про классы, поверте Автор ... и просто не берите эту книгу...
PS. Так же подобные вещи обсуждались
ТУТ(более внимательно читаем Ответы Сергея Горелкина
)