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

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

Как абстрагироваться от типов свойств класса? [D7, XP]


kostyl_kostyl ©   (2009-07-23 14:23:00) 

Скажите пожалуйста как абстрагироваться от типа свойств класса.
Например, есть класс А у которого есть свойства Р1 и Р2. Доступ к этим свойствам происходит через методы доступа которые обращаются к каким то закрытым данным. Я предполагаю что эти закрытые данные реализуются в виде класса с двумя свойствами. Причем таких класса два один со свойствами типа интегер, а другой с типом реал. В конструкторе класса А я задую как-то какие типы у его данных, инстанцируя соответствующий класс в закрытом свойстве. Не могу понять где надо делать перезагрузку и вообще как. Допустим есть абстрактный класс, который определяет методы доступа к данным скрытого класса. От него два класс с реал свойствами и интегер свойствами. А как в классе А это реализовать не пойму.


kostyl_kostyl   (2009-07-23 16:57:00) [1]

Удалено модератором
Примечание: Создание пустых сообщений


clickmaker   (2009-07-23 16:54:00) [2]

в D7 еще нельзя


kostyl_kostyl   (2009-07-23 16:52:00) [3]

Kolan ©
А, понял. Ну я не такой профан, чтобы знать, что в Делфи так можно делать. Спасибо.


Kolan   (2009-07-23 16:26:00) [4]

Я вот про что:


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 THiddenData<T> = class
 private
   FData: T;
 public
   property Data: T read FData write FData;
 end;

 TA<T> = class
 private
   FHiddenData: THiddenData<T>;
   function GetP: T;
   procedure SetP(const Value: T);
 public
   constructor Create();
   destructor Destroy; override;
   property P1: T read GetP write SetP;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 TestI: TA<Integer>;
 TestS: TA<String>;
begin
 TestI := TA<Integer>.Create;
 TestS := TA<String>.Create;
 try
   TestI.P1 := 10;
   TestS.P1 := 'Hello!';

   ShowMessage(IntToStr(TestI.P1));
   ShowMessage(TestS.P1);
 finally
   TestI.Free;
   TestS.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ TA<T> }

constructor TA<T>.Create;
begin
 FHiddenData := THiddenData<T>.Create;
end;

destructor TA<T>.Destroy;
begin
 FHiddenData.Free;
 inherited;
end;

function TA<T>.GetP: T;
begin
 Result := FHiddenData.Data;
end;

procedure TA<T>.SetP(const Value: T);
begin
 FHiddenData.Data := Value;
end;

end.


kostyl_kostyl   (2009-07-23 16:13:00) [5]


> type MyVariant = record
>  IntVal: integer;
>  RealVal: Real;
> end;
>

Ну так наверно буду пробовать...


Kolan   (2009-07-23 16:04:00) [6]

Я думаю вам пригодятся параметризованные классы, aka generics.


clickmaker   (2009-07-23 16:04:00) [7]

type MyVariant = record
 IntVal: integer;
 RealVal: Real;
end;


kostyl_kostyl   (2009-07-23 16:00:00) [8]


> а чем Variant не подходит?

не хочу подключать...


clickmaker   (2009-07-23 15:55:00) [9]

> Какой-то ООП прием или шаблон

а чем Variant не подходит? класс 1 вернет интегер, класс 2 - реал


kostyl_kostyl   (2009-07-23 15:48:00) [10]


> А что ты ожидал?

Какой-то ООП прием или шаблон.


Palladin   (2009-07-23 15:40:00) [11]

А что ты ожидал?


kostyl_kostyl   (2009-07-23 15:37:00) [12]

мда, не густо...


Bruth   (2009-07-23 14:45:00) [13]

Удалено модератором
Примечание: http://www.delphimaster.ru/forums.shtml#rule Запрещается: п.8


Alf   (2009-07-23 14:43:00) [14]


> Как абстрагироваться от типов свойств класса?

использовать C++


Palladin   (2009-07-23 14:37:00) [15]


> Как абстрагироваться от типов свойств класса?

использовать Variant


Наверх

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