![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как абстрагироваться от типов свойств класса? [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