Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики / 13 сообщений из 13, страница 1 из 1
15.03.2019, 11:18
    #39786501
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
Пытаюсь разобраться с обобщенными классами...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
type
  TParameters<T> = class
    FValue: T;
    FValueOld: T;
  protected
    function CheckChenged: boolean;
  public
    constructor Create(AValue: T);
    property Value: T read FValue write FValue;
    property isChanged: boolean read CheckChenged;
  end;


implementation


constructor TasParameters<T>.Create(AValue: T);
begin
  FValueOld := AValue;
  FValue := FValueOld;
end;

function TasParameters<T>.CheckChenged: boolean;
begin
  result := FValueOld <> FValue;
end;



на вот это
Код: pascal
1.
result := FValueOld <> FValue;


получаю: [dcc32 Error] Unit1.pas(48): E2015 Operator not applicable to this operand type

Как же выполнять внутри класса какие-либо операции над <T>?
...
Рейтинг: 0 / 0
15.03.2019, 11:34
    #39786519
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
Подсказываю решение самому себе:
Код: pascal
1.
2.
3.
4.
5.
6.
function TasParameters<T>.CheckChenged: boolean;
var
    comparer: IEqualityComparer<T>;
begin
  result := comparer.Equals(FValueOld, FValue);
end;
...
Рейтинг: 0 / 0
15.03.2019, 11:47
    #39786532
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
нет, все равно что-то не то...
Код: pascal
1.
2.
  ParamInt := TParameters<integer>.Create(100);
  ParamStr := TParameters<string>.Create('Bla-Bla-Bla');


на это мне компилятор отвечает:
[dcc32 Error] Unit1.pas(62): E2010 Incompatible types: 'Unit1.TParameters<System.Integer>' and 'Integer'
[dcc32 Error] Unit1.pas(63): E2010 Incompatible types: 'Unit1.TParameters<System.string>' and 'string'

В чем проблема?
...
Рейтинг: 0 / 0
15.03.2019, 11:53
    #39786541
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
client6aacВ чем проблема?
ParamInt что это?
...
Рейтинг: 0 / 0
15.03.2019, 11:54
    #39786542
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
Код: pascal
1.
2.
3.
4.
  ParamInt := TasParameters<integer>.Create(100);
  ParamStr := TasParameters<string>.Create('Bla-Bla-Bla');
  ParamInt := 10;
  ParamStr := 'qwerty';


вернее, компилятор ругается на 3 и 4 строчки...
Да и во второй пост оказался бредовым...

В общем не понятно с этими дженериками...
...
Рейтинг: 0 / 0
15.03.2019, 11:55
    #39786543
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
wadmanParamInt что это?

Код: pascal
1.
2.
3.
4.
5.
6.
  TForm1 = class(TForm)
  private
    ParamInt: TasParameters<integer>;
    ParamStr: TasParameters<string>;
  public
  end;
...
Рейтинг: 0 / 0
15.03.2019, 12:03
    #39786550
zinpub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
client6aac,
Код: pascal
1.
2.
3.
4.
 ParamInt := TasParameters<integer>.Create(100);
  ParamStr := TasParameters<string>.Create('Bla-Bla-Bla');
  ParamInt.Value := 10;
  ParamStr.Value := 'qwerty';
...
Рейтинг: 0 / 0
15.03.2019, 12:51
    #39786612
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
zinpub,
блиииин, ну тупанул уже, так тупанул... заблудился в трех соснах:)
спасибо
...
Рейтинг: 0 / 0
15.03.2019, 12:55
    #39786621
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
ну и до кучи правильный метод проверки
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function TParameter<T>.CheckChenged: boolean;
var
  comparer: IEqualityComparer<T>;
begin
  comparer := TEqualityComparer<T>.Default;
  result := not comparer.Equals(FValueOld, FValue);
end;
...
Рейтинг: 0 / 0
15.03.2019, 13:17
    #39786655
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
client6aac,

не-а, не правильный. При кжадом вызове с нуля гонять RTTI, по нему исктаь классы, создавать экземпляры...

Смотри как коллекции стандартные сделаны и гед они comparer ищут.

В общем,
client6aac
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  TParameters<T> = class
private
   comparer: IEqualityComparer<T>;
....  

function TParameter<T>.CheckChenged: boolean;
begin
  if nil = comparer then
      comparer := TEqualityComparer<T>.Default;
  result := not comparer.Equals(FValueOld, FValue);
end;
...
Рейтинг: 0 / 0
15.03.2019, 13:53
    #39786704
client6aac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
Arioch,
мысль понял, спасибо
...
Рейтинг: 0 / 0
15.03.2019, 17:34
    #39786902
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
AriochВ общем,Или более оптимальный вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TParameters<T> = class
strict private
  class var
    comparer: IEqualityComparer<T>;
strict private
  class constructor Create;
....  

class constructor TParameter<T>.Create;
begin
  comparer := TEqualityComparer<T>.Default;
end;

function TParameter<T>.CheckChenged: boolean;
begin
  result := not comparer.Equals(FValueOld, FValue);
end;

Тогда создастся один компарер на все экземпляры
...
Рейтинг: 0 / 0
15.03.2019, 17:50
    #39786916
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дженерики
_Vasilisk_
Код: pascal
1.
2.
3.
4.
class constructor TParameter<T>.Create;
begin
  comparer := TEqualityComparer<T>.Default;
end;



а вот это спорно.

Он может понадобиться, а может и не понадобиться, программы разные бывают.

Насчёт class var - да, так лучше.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]