![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, уважаемые форумчане!
Помогите мне в нелегком деле. Мне дали задания по Делфи создать свой собственный класс (любую прогу), но чтобы там применялась: - наследование - полиморфизм - инкапсуляция. Теорию я сам всю выучил до зубов, а на практике ничего не получается. Прошу у Вас помощи! С Уважением, Роман! |
|
#2
|
||||
|
||||
|
Очень рекомендую учебник: "С. Бобровский. Delphi7. Учебный курс"
Примеры: 1) Инкапсуляция Добавляешь в проект два новых модуля Unit2 и Unit3; В Unit2 в раздел interface: Код:
type TOne = class(TObject) private function F1(x,y:integer):integer; public function F2(x,y:integer):integer; function F3(x:integer):integer; end; Код:
function TOne.F1(x, y: integer): integer; begin Result:= x + y; end; function TOne.F2(x, y: integer): integer; begin Result:= x*y + Self.F1(x,y); // x*y + x + y end; function TOne.F3(x: integer): integer; begin Result:= x + 2; end; ссылку на второй модуль Код:
uses Unit2; Код:
type TTwo = class(TOne) public function F2(x,y:integer):integer; end; Код:
function TTwo.F2(x, y: integer): integer; begin Result:=x*x*y+Self.F3(y); // x*x*y+y+2 // 2) Наследование // функция F3 наследуется от родительского класса TOne end; Т.к функция F1 класса TOne объявлена в разделе private, то она видна только в даннов классе(ну и в модуле, где описан класс), о вот функции F2 и F3 можно свободно использовать. 3) Полиморфизм теперь в главный модуль: добавить ссылки на Unit2 и Unit3; и, например, по клику на кнопке: Код:
var obj1:TOne;
obj2:TTwo;
begin
obj1 := TOne.Create;
obj2 := TTwo.Create;
ShowMessage('x=3, y=5, F2='+IntToStr(obj1.F2(3,5))); // 3*5+3+5=23
ShowMessage('x=3, y=5, F2='+IntToStr(obj2.F2(3,5))); // 3*3*5+y+2=52
// - вот пример полиморфизма - вызывается метод класса TTwo
// а вот чтобы вызвать родительский метод F2 надо:
ShowMessage('x=3, y=5, F2='+IntToStr(TOne(obj2).F2(3,5))); // 3*5+3+5=23
obj2.Free;
obj1.Free;
end; |
|
#3
|
|||
|
|||
|
Создайте наследника от одного из стандартных классов и будет у вас сразу инкапсуляция и наследование. Для демонстрации полиморфизма нужно перекрыть один из виртуальных методов класса-предка.
Вот пример наследника TLabel, который по щелчку мыши открывает заданную страницу в браузере: Код:
unit Unit2;
interface
uses
Windows, Classes, StdCtrls, ShellAPI;
Type
TLinkLabel = class(TLabel)
private
FLink: String;
protected
public
constructor Create(AOwner: TComponent; ALink: String);
procedure Click; override;
property Link: String read FLink write FLink;
end;
implementation
{ TLinkLabel }
procedure TLinkLabel.Click;
begin
inherited;
if FLink <> '' then
ShellExecute(Parent.Handle, 'open', PChar(FLink), nil, nil, SW_SHOW);
end;
constructor TLinkLabel.Create(AOwner: TComponent; ALink: String);
begin
inherited Create(AOwner);
FLink := ALink;
end;
end.Потом в главной форме пишем, например, так: Код:
procedure TForm1.FormCreate(Sender: TObject); var L: TLabel; begin // Создаем объект L := TLinkLabel.Create(Self, 'http://www.delphisources.ru'); L.Top := 10; L.Left := 10; L.Caption := 'DelphiSources'; L.Parent := Self; end Полиморфизм здесь в том, что переменная L объявлена как TLabel, тем не менее после присвоения ей значения типа TLinkLabel, она корректно вызывает переопределенный метод Click. Пример, конечно, абсолютно высосанный из пальца и не жызненный. |