|
|
Регистрация | << Правила форума >> | 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. Пример, конечно, абсолютно высосанный из пальца и не жызненный. |