Презентація на тему «Класи в Pascal»

content: Класи в Pascal

content: Об'єкти реального світу можна описати за допомогою величин, що характеризують стан об'єкта та його поведінку (що робить об'єкт або що з ним можна робити), поведінка змінює стан об'єкта. Для адекватного моделювання реального світу в програмах, потрібно мати сутність, яка поєднує дані та алгоритм.РучкаГотовністьРозмірЦінаКолірКолір чорнилаЗапас чорнилаУвімкнутиВимкнутиЗаписатиЗмінити чорнилоbooleaninteger (const)realrealprocedurefunction

content: Unit Pen_unit;type Tpen = classprivateready: boolean;price: real;colour: TColor;paintColour: TColor;paintSupply: real;publicfunction isReady: boolean;procedure SwitchOn;procedure SwitchOff;даніметодиоголошенняОголошення класу відбувається в модулі, але це можна робити і в головній програмі.

content: procedure Write (aWord: string);procedure Rechange (aPaint: TColor);constructor Create (a, b: TColor; p, s: real);end;Implementationbeginfunction Tpen.isReady: boolean;beginresult := ready;end;procedure Tpen.switchOnbeginready:=paintSupply > 0;end;…end.

content: Program prg_1;uses Pen_unit;var a: Tpen;begina:=Tpen.Create(cOrange, cBlack; 2.5, 125.7);a.Write(‘Hello, World!');a.switchOff;a.Free; t звільнити динамічну пам'ятьend.В об'єктній моделі ObjectPascal усі екземпляри класів динамічні. Змінна об'єктного типу – це неявний вказівник або посилання на динамічну пам'ять, де можна розташувати екземпляр класу.

content: Екземпляр створюють за допомогою конструктора і знищують за допомогою деструктора. Кожен екземпляр класу має окрему пам'ять і власний набір полів. Усі екземпляри класу поділяють єдиний набір методів, оголошених у класі.constructor Tpen.Create(a, b: Tcolor; p, s: real);begin colour:=a;paintColor:=b;if p>=1.0 then price:=pelse price:=1.0;if s>=100.0 then paintSupply:=selse paintSupply:=100.0;ready:=false;end;

content: Інкапсуляція - обмеження доступу до данихЦе дозвіл доступатися до спільних даних обмеженій кількості методів, доступ для всіх організовується за посередництва відповідальних за це методів.Unit shape_1;InterfaceType Trect = class(TObject)privateta, b: real;publicconstructor Create(x, y: real);destructor Destroy;function square: real;function Perym: real;

content: Procedure WriteOut;Implementationbeginconstructor Trect.Create(x, y: real);begin a:=x; b:=y; end;destructor Trect.Destroy;begin writeln(‘Said “Bye”'); end;procedure Trect.writeOut;begin writeln(a, b, ‘Rectangle'); end;function Trect.Sguare: real;begin result:=a*b; end;function TRect.Perym: real;beginresult:=2*(a+b);end;

content: constructor TRect.Create;begina:=3;b:=4;end;end.Конструктор задає значення полів об'єкта, вони можуть бути (початкові значення) в тексті конструктора або передані через параметри. Імена параметрів повинні відрізнятися від імен полів.Деструктор – це метод, відповідальний за коректне звільнення пам'яті від екземпляру класу.

content: Program p_1;uses Shape_1;var tts:array [1…100] of TRect;i:integer;m:real;begin…m:=s[1].Square;for i:=2 to 100 doif s[i].Square>m thenm:=s[i].Square…end.Якщо частина коду написана двічі, виносимо її в окремий метод.

content: TrectB: Trect + getB, setBunit shape_2interfaceuses shape_1typeTRectB = class(TRect);Клас отримує (успадковує) від поперднього класу всі поля і наслідує їх функціональність.publicfunction getB:real;procedure setB(y; real);procedure writeOut(t:textfile);end;implementationfunction TRectB.getB:real;beginresult:=b;end;

content: procedure TRuctB.setB(y:real);beginb:=y; calls;end;procedure writeOut(t:textfile);beginwriteln(t, ‘Advanced Rect', a, ‘x', b);end;private діє разом з поділом на unit. Доступ ззовні модуля заборонено всім без винятку, всередині модуля дозволено підкласам. Для того, щоб підкласи базового класу мали доступ до окремих полів даних, їх розташовують в області доступу protected.

content: Program p2;uses shape_1; shape_2;vartp:Trect;q:TRectB;beginp.TRect.Create;q:=Trect.tCreate(7, 12);q.setB(0.5)if p.squarethen p.writeOut(output)else q.writeOut(output)p.Free;q.Free;end.прямокутник розміром 3×4

content: Метод WriteOut у класі TRect оголошено звичайним чином як статичний метод такий, як square, perym,…тому в коді деструктора виклик WriteOut прив'язується на етапі компіляції до методу TRect.WriteOut, це називають раннім зв'язуванням.Для того, щоб деструктор викликав метод WriteOut потрібного класу, його оголошують віртуальним.Виклики віртуальних методів виконують за допомогою пізнього зв'язування, що відбувається на етапі виконання програми.Клас Tobject є базовим. Усі інші класи є його нащадками. Free – метод, який звільняє динамічну пам'ять. Destroy – деструктор.

content: Підклас успадковує від базового класу усі без винятку поля класу і наслідує його поведінку, це означає, що екземпляри підкласу здатні опрацьовувати такі ж повідомлення, як і екземпляри базового. Підкласові доступні усі public і protected методи базового класу, тому екземпляри підкласу можуть без перешкод і без змін використовувати методи базового класу. Дуже часто підклас змінює поведінку базового (перевизначає окремі методи) і/або доповнює (додає нові методи).Взаємозвязки між базовим і похідними класами

content: Для перевизначення методів є дві можливості:для звичайних (статичних) методів дозволено використовувати довільну сигнатуру, тобто, метод з тим самим іменем у підкласі може мати інший набір параметрів;Віртуадбні методи перевизначають завжди з ттою самою сигнатурою.var c, a, b: Trect;begina:=TRect.Create(3, 4);b:=TRect.Create(4, 3);if a.Square > b.Squarethen c:=aelse c:-bc.WriteOut(output);…end.копіювання вказівника

content: Отримання копії об'єктаЩоб отримати копію об'єкта, необхідно створити додатковий конструктор, який прийматиме параметром об'єкт того ж класу:d:=TRect.CopyCreate(a)

content: Раннє і пізнє зв'язуванняПриклад: купівля кілограму апельсинів.Ми заздалегідь знаємо, що нам потрібно купити 1 кг апельсинів. Тому ми беремо невеликий пакет, небагато, але достатньо грошей, щоб вистачило на цей кілограм.Виходячи з будинку, ми не знаємо чого і скільки нам потрібно купити. Тому ми беремо машину(а раптом буде багато всього і важко нести?), запасаємося пакетами великих і малих розмірів і беремо якомога більше грошей. Їдемо на ринок і з'ясовується, що потрібно купити тільки 1 кг апельсинів.

content: При застосуванні раннього зв'язування, ми ніби говоримо компілятору: "Я точно знаю, чого я хочу. Тому жорстко(статично) зв'язуй усі виклики функцій". При застосуванні механізму пізнього зв'язування ми говоримо компілятору: "Я доки не знаю, чого я хочу. Коли прийде час, я повідомлю, що і як я хочу".Висновки:Таким чином, під час раннього зв'язування методи зв'язуються при першій слушній нагоді. У пізньому зв'язуванні реалізований спеціальний механізм, який визначає, як відбуватиметься зв'язування, що викликається і викликає методи, коли виклик буде зроблений фактично.Очевидно, що швидкість і ефективність при ранньому зв'язуванні вищі, ніж при використанні пізнього зв'язування. У той же час, пізнє зв'язування забезпечує деяку універсальність зв'язування.

content: Адресу динамічного методу міститиме таблиця того класу, де він визначенийTSquare = class(TRect)constructor tCreate(x: real);procedure WriteOut(var t:textfile);end;//public можна упустити.constructor TSquare.Create(x: real );begininheritedCreate(x, x);end;override

content: Name() – overloadName(x) – overrideTshapeTRectttTCircleTRectBtTSquarea, sP-4aS=a2TRectbP=2(a+b)S=abTRectB

content: Tshape = clas(TObject)privates:real;protected procedure Calc S; virtual; abstract;publicfunction Perym: real; virtual; abstract;function Square: real;procedure WriteOut(var T: textfile); virtual; absract;destructor Destroy; override;end;function TShape Square: real;beginresult:=s;end;

content: Tshape 3dTPiramide TConus TCylindr TParalelepipedbase: TShapeTshape 3d = class(TObject)privatebase: Tshape;h: real;end;ЦиліндрtКонусttПірамідаtПаралелепіпедV=Sосн.httV = Sосн.htV= Sосн.ht V=Sосн.h…

content: Кожен клас повинен містити свій конструктор.TShape 3dbase: TShape;h: real;base.Square; v; aside.Square; v; asurf.Square; v; aVolume; v; aWriteOut; v; a

content: function TShape3d.base.square: real;beginresult:=base.Square();end;constructor TCylindr.Create(a, b: real);beginbase:=TCircle.Create(a);h:=b;end;constructor TParalelepiped.Create(x, y, z: real);beginbase:=TRect.Create(x, y);h:=z;end;

content: function TDirectShape.volume: real;beginresult:=base.square*h;end;Завдання:Задано виміри 12 різних об'ємних фігур, потрібно надрукувати інформацію про кожного з них, знайти фігуру з найбільшимоб'ємом і з найменшою повноюповерхнею.

content: const n=12;type mas=array[1…n] of TShape3dvar a: mas;k, i: integer;x, y, z: real;for i:=1 to n doA[i].writeOut;beginfor i:=1 to n dobeginread(k);case k ofCylindr: beginreadln(x, y);A[i]:=Tcylindr.Create(x, y);

content: Paralelepiped: beginreadln(x, y, z);A[i]:= Tparalelepiped.Create(x, y, z);end;… end;…end.TRectAB = class;private a,b: real;publicfunction getB(): real;procedure setB(x: real);function Square(): real;procedure WriteOut();

content: constructor Create(x, y: real);end;…beginreadln(size);R:=TRectAB.Create(size, 7);R.setA(R.getA + z);TRect_AB = classprivateFa, Fb: real;t// fieldprotectedfunction getA(): real;function getB(): real;procedure setA(x: real);procedure setB(x: real);

content: publicconstructor Create(x; y: real);function Square(): real;property a: real: read getA write setA;property b: real: read getB write setB;end;Property описує інтерфейсний елемент, його використовують для неявного виклику методів.beginR:=TRect_AB.Create(size, 7);R.a:=R.a+2;

content: Property – новий спосіб доступу. Ключові слова read і write вказують чи буде для властивості доступ для читання і для запису відповідно. Кожна з цих частин може бути відсутня