Распознание типов в Run time

Кроик Семён
Дата: 18.05.2011 11:25:11
P.S.
program TestOverload;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

procedure Add(value: string); overload;
begin
   Writeln('"string" added');
end;

procedure Add(value: integer); overload;
begin
   Writeln('"integer" added');
end;

procedure Add(value: pointer); overload;
begin
   Writeln('"pointer" added');
end;

procedure Add(value: TObject); overload;
begin
   Writeln('"TObject" added');
end;

var
   s : string;
   i : integer;
   p : pointer;
   o : TList;

begin
   Add(s);
   Add(i);
   Add(p);
   Add(o);
   readln;
end.
Gwa
Дата: 18.05.2011 11:29:59
Имхо, всякая специальная вещь лучше всякой универсальной.
Соедините вместе, скажем, магнитофон и пылесос и поймёте, что стало невозможно пользоваться ни тем ни другим..
Кроик Семён
Дата: 18.05.2011 11:34:22
Соедините вместе, скажем, колеса и мотор и поймёте, что стало невозможно пользоваться ни тем ни другим
softmaker
Дата: 18.05.2011 11:39:27
2Кроик Семён
А ещё сохранить тип переменной, и OnDestroy case по типу переменной. - это в приведённом SDL и написано. Мне хотелось сделать средствами RTTI самой Delphi.
softmaker
Дата: 18.05.2011 11:41:47
2Gwa
Соедините вместе фотоаппарат, компьютер, GPRS и телефон. И поймёте, что пользоваться смартфоном вообще невозможно. =)
Gwa
Дата: 18.05.2011 11:45:46
Кроик Семён
Соедините вместе, скажем, колеса и мотор и поймёте, что стало невозможно пользоваться ни тем ни другим

Совершенно верно, если речь идёт об универсализации, т.е. создаётся некая сущность мотороколесо или колёсомотор, которая может использоваться в качестве того или другого. Если же объединять их механически, т.е. мотор остаётся мотором, а колесо колесом (но в составе), то результат совсем другой..
Maxim Rusov
Дата: 18.05.2011 11:46:30
softmaker
Мне хотелось сделать средствами RTTI самой Delphi.

Вы, как я понял, хотите сделать что-то типа templates. При чем здесь RTTI? Templates раскрываются во время компиляции, а не run-time.
softmaker
Дата: 18.05.2011 11:52:13
Да. Что-то типа. И раскрываются они в процессе компиляции (см. интерфейс в первом посте __listType берётся из другого юнита во время компиляции)
Проблема в том, что если этот __listType is TObject, то на Destroy его нужно кильнуть. А вот определить что это простым методом не получается.
Возникла ещё мысль к контейнеру вязать ещё один и на overloaded функции - тех кто TObject совать туда а по Destroy килять второй контейнер - но это ИМХО ещё больший изврат, чем подобие своего аналога TCustomVariant
Maxim Rusov
Дата: 18.05.2011 11:58:17
softmaker
...TObject, на Destroy его нужно кильнуть...


Если это единственная проблема, и вариант с Define'ом не нравится, то сделай наследника:

__cOblList = class(__cList)

И перекрой в нем деструктор. Это, кстати, по любому полезно - далеко не всегда контейнер должен прибивать объекты, будет возможность выбора.
softmaker
Дата: 18.05.2011 12:00:11
Ты предлагаешь делать 2 контейнера: для ObjList и для justTypeList ?
Зачем перекрывать деструктор __cList если я его и так сам пишу?