Наследование (2).pptx
- Количество слайдов: 12
Наследование Прикладное программирование
Наследование • Концепция объектно-ориентированного программирования предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. • Такой механизм получения новых классов называется порождением. • При этом новый, порожденный класс (потомок) наследует свойства и методы своего базового, родительского класса. • В объявлении класса-потомка указывается класс родителя.
Наследование • Класса Tperson является родительским type TName = string[15]; TAddress = string[35]; TPerson = class private FName: TName; FAddress: TAddress; Constructor Create(Name: Tname); Procedure Show; Function Get. Name: TName; Function Get. Address: TAddress; Procedure Set. Address(New. Address: TAddress); public Property Name: Tname read Get. Name; Property Address: Taddress read Get. Address write Set. Address; end; • Класс TEmployee (сотрудник) может быть порожден от класса TPerson путем добавления поля FDepartment (отдел). TEmployee = class(TPerson) FDepartment: integer; constructor Create(Name: TName; Dep: integer); end;
Наследование • Класс TEmpioyee должен иметь свой собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей: constructor TEmpioyee. Create(Name: Tname; Dep: integer); begin inherited Create(Name); FDepartment: =Dep; end; • Директивой inherited вызывается конструктор родительского класса. • После этого присваивается значение полю класса-потомка.
Наследование • После создания объекта производного класса в программе можно использовать поля и методы родительского класса. engineer : = TEmployee. Create('Сидоров', 413); engineer. address : = 'ул. Блохина, д. 8, кв. 10'; • Первая инструкция создает объект типа TEmployee, вторая — устанавливает значение свойства, которое относится к родительскому классу.
Директивы protected и private • Элементы класса, объявленные в секции protected (защищенный), доступны только в порожденных от него классах. • Область видимости элементов класса этой секции не ограничивается модулем, в котором находится описание класса. • Обычно в секцию protected помещают описание методов класса. • Элементы класса, объявленные в секции private (закрытый), видимы только внутри модуля. • Эти элементы не доступны за пределами модуля, даже в производных классах. • Обычно в секцию private помещают описание полей класса, а методы, обеспечивающие доступ к этим полям, помещают в секцию protected.
Директивы protected и private TPerson = class private FName: TName; FAddress: TAddress; protected Constructor Create(Name: TName); Function Get. Name: TName; Function Get. Address: TAddress; Procedure Set. Address(New. Address: TAddress); Property Name: Tname read Get. Name; Property Address: Taddress read Get. Address write Set. Address; end;
Полиморфизм и виртуальные методы • Полиморфизм — это возможность использовать одинаковые имена для методов, входящих в различные классы. • Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта.
Полиморфизм и виртуальные методы tуре TPerson = class fname: string; constructor Create(name: string); function info: string; virtual; end; TStud = class(TPerson) fgr: integer; // номер учебной труппы constructor Create(name: string; gr: integer); function info: string; override; end; TProf = class(TPerson) fdep: string; // название кафедры constructor Create(name: string; dep: string); function info: string; override; end;
Полиморфизм и виртуальные методы • • Объявление метода виртуальным дает возможность дочернему классу произвести замену виртуального метода своим собственным. В каждом дочернем классе определен свой метод info, который замещает соответствующий метод родительского класса (метод порожденного класса, замещающий виртуальный метод родительского класса, помечается директивой override). function TPerson. info: string; begin result : = ''; end; function TStud. info: string; begin result : = fname + ' гp. ' + Int. Tostr(fgr); end; function TProf. info: string; begin result : = fname + ' каф. ' + fdep; end;
Полиморфизм и виртуальные методы • Так как оба класса порождены от одного и того же базового, объявить список студентов и преподавателей можно так: list: array[1. . 10] of TPerson; • Элементами массива list могут быть как объекты класса TStud, так и объекты класса TProf. • Вывести список студентов и преподавателей можно применением метода info к элементам массива: st : = ''; for i: =1 to 10 do if list[i]<>NIL then st : = st + list[i]. Info + #13; Show. Message (st); Во время работы программы каждый элемент массива может содержать как объект типа Tstud, так и объект типа TProf.
Полиморфизм и виртуальные методы procedure TForml. Buttonl. Click(Sender: TObject); begin if n < SZL then begin // добавить объект в список n: =n+l; if Radiobuttonl. Checked then // создадим объект TStud List[n]: =TStud. Create(Edit 1. Text, Str. To. Int(Edit 2. Text)) else // создать объект TProf List[n]: =TProf. Create(Edit 1. Text, Edit 2. Text); // очистить поля ввода Edit 1. Text : = '' ; Edit 2. Text : = ''; Edit 1. Set. Focus; // курсор в поле Фамилия end else Show. Message('Список заполнен!'); end; procedure TForm 1. Button 2 Click(Sender: TObject); // щелчок на кнопке Список var i: integer; st: string; // список begin for i: =1 to SZL do if list[i] <> NIL then st: =st + list[i]. info + 113; Show. Message('Cпиcoк'+#13+st); end;
Наследование (2).pptx