Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно наследовать свойства?


MegaVolt ©   (2004-10-15 16:10:00) 

есть некий родительский клас.
У него есть

property Port[A:cardinal]:cardinal read GetPort write SetPort;

Как правильно описывать Get и Set port чтобы в наследниках можно было их изменить.
так?

 protected
GetPort ....
SetPort ....


Или данное действие вообще не так делается?


Ega23   (2004-10-18 13:28:00) [1]

Это уже не раз поднималось в темах, типа "А вот в С++ есть дружественные классы, а в Delphi - нет."


MegaVolt   (2004-10-18 12:32:00) [2]

Я не видел такой темы :(


KSergey   (2004-10-18 12:12:00) [3]

> 5] MegaVolt ©   (18.10.04 11:54)
> Какой ужас :( А это почему возможно то?

Так в хелпе написано, документированное поведение.
Перетиралось тут не раз


MegaVolt   (2004-10-18 11:54:00) [4]

Какой ужас :( А это почему возможно то?


Ega23   (2004-10-18 11:00:00) [5]

А я не перекрытие тебе демонстрировал, а то, что описание классов в одном юните даёт доступ к private-секциям ДАЖЕ без наследования!


MegaVolt   (2004-10-18 10:48:00) [6]

А где перекрытие?


Ega23   (2004-10-15 19:20:00) [7]

По-идее, конечно в protected надо отписывать.
Но вот такая конструкция спокойно живёт:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TMyClass=class(TObject)
  private
   FX:Integer;
  public
   property X:Integer Read FX Write FX;
 end;

 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
  MyClass:TMyClass;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
MyClass:=TMyClass.Create;
MyClass.FX:=5;
Label1.Caption:=IntToStr(MyClass.FX);
MyClass.X:=10;
Label2.Caption:=IntToStr(MyClass.X);
end;

end.


MegaVolt   (2004-10-15 19:02:00) [8]

Запросто перекрываются. Раз видны значит и перекрыть можно. А то что в одном или не в одном юните так вообще без разницы.


Ega23   (2004-10-15 18:18:00) [9]

Это как? Ведь для наследника эти функции недоступны как их можно перекрыть?

А ты попробуй в одном юните один класс от другого отнаследовать.


MegaVolt   (2004-10-15 16:39:00) [10]

Это внешнее устройство так что выносить не нужно :)


Skier   (2004-10-15 16:35:00) [11]

и, возможно, в protected нужно будет вынести структуру, которая
"управляет" свойством Port это, видимо, список или массив...


Skier   (2004-10-15 16:33:00) [12]

protected
procedure SetPort(Index : Cardinal; Value : Cardinal); virtual;
function GetPort(Index : Cardinal) : Cardinal; virtual;


MegaVolt   (2004-10-15 16:30:00) [13]

Это как? Ведь для наследника эти функции недоступны как их можно перекрыть?


Ega23   (2004-10-15 16:28:00) [14]

Если всё в одном юните, то пофигу.


MegaVolt   (2004-10-15 16:27:00) [15]

Если они в приват будут как в потомке их перекрыть если они не видны наследнику?


Ega23   (2004-10-15 16:26:00) [16]

Я их вообще в private оставляю.


MegaVolt   (2004-10-15 16:18:00) [17]

Ega это само собой. Подход правилен? Т.е. я их из privat закидываю в protected или public?


Ega23   (2004-10-15 16:15:00) [18]

опиши как virtual;


Наверх

Титульная страница Поиск, карта сайта Написать письмо