Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RTTI один геттер для различных свойств, являющихся потомком одного класса. / 20 сообщений из 20, страница 1 из 1
17.08.2017, 14:47:17
    #39506890
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Добрый день!
Имеется базовый класс
Код: pascal
1.
2.
3.
TBaseClass = class(TPersistent)
   ...
end;


а также два потомка
Код: pascal
1.
2.
3.
4.
5.
6.
7.
TFirstClass = class(TBaseClass)
   ...
end;

TSecondClass = class(TBaseClass)
   ...
end;



нужно реализовать один геттер для свойств класса TFirstClass, TSecondClass и т.д. (их количество неизвестно).
сейчас делаю так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  TMyClass = class
  private
    function InternalGetter(Index: Integer) : TBaseClass;
    procedure InternalSetter(Index: Integer; aObject: TBaseClass);
  public
    property FirstClass : TFirstClass index 0 read InternalGetter write InternalSetter; <<Тут ошибка о несоответствии типов
    property SecondClass: TSecondClass index 1 read InternalGetter write InternalSetter; <<Тут ошибка о несоответствии типов
  end;



Имеется ли возможность преобразовать к одному типу или вообще не указывать тип у геттера.
или имеется какая-то другая возможность.

Заранее спасибо.
...
Рейтинг: 0 / 0
17.08.2017, 16:11:35
    #39506982
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
FoxJr,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TAllBaseClass = class of TBaseClass;

  TMyClass = class
  private
    function InternalGetter(Index: Integer) : TAllBaseClass;
    procedure InternalSetter(Index: Integer; aObject: TAllBaseClass);
  public
    property FirstClass : TAllBaseClass index 0 read InternalGetter write InternalSetter;
    property SecondClass: TAllBaseClass index 1 read InternalGetter write InternalSetter;
  end;
...
Рейтинг: 0 / 0
17.08.2017, 16:15:00
    #39506986
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Спасибо, но в последующем у каждого потомка будут свои методы и нужно будет их использовать, а каждый раз приводить к нужному типу накладно.
может есть способ тогда при обращении к свойству указать его тип?
...
Рейтинг: 0 / 0
17.08.2017, 16:15:00
    #39506987
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
FoxJr,

Код: pascal
1.
2.
3.
4.
5.
6.
   private
      procedure SetBaseClass(const Index:integer; ABaseClass:TBaseClass);
      function GetBaseClass(const Index:integer):TBaseClass;
   public
      property BaseClasses[Index:integer] : TBaseClass read GetBaseClass write SetBaseClass;
   



Не подойдет?
...
Рейтинг: 0 / 0
17.08.2017, 16:17:20
    #39506991
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
FoxJr,

Гм.. А число наследников и их возможные методы неизвестно в принципе? Я к тому, что в базовый класс можно напихать заглушек, которые переопределять у наследников.
...
Рейтинг: 0 / 0
17.08.2017, 16:17:38
    #39506993
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
DarkMaster,

Нет к сожалению не пойдет.
...
Рейтинг: 0 / 0
17.08.2017, 16:19:44
    #39506996
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
DarkMaster,

Нет, не известно.
...
Рейтинг: 0 / 0
17.08.2017, 16:39:36
    #39507007
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  TMyClass = class
  public
    function GetRandomClass<T: TBaseClass>: T;
  end;

var
  C: TMyClass;
begin
  C.GetRandomClass<TFirstClass>().MethodFirst
  C.GetRandomClass<TSecondClass>().MethodSecond
...
Рейтинг: 0 / 0
17.08.2017, 16:43:04
    #39507012
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
X-Cite,

Идея интересная, но если мне нужно сделать несколько свойств, которые могут иметь одинаковый тип, например
Код: pascal
1.
2.
  property First: TFirtsClass ...
  property First2: TFirstClass ...



тогда не получится
...
Рейтинг: 0 / 0
17.08.2017, 16:50:59
    #39507013
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TMyClass = class
  public
    function GetRandomClass<T: TBaseClass>(const aIndex: Integer = 0): T;
  end;

var
  C: TMyClass;
begin
  C.GetRandomClass<TFirstClass>(0).MethodFirst
  C.GetRandomClass<TFirstClass>(1).MethodFirst
  C.GetRandomClass<TFirstClass>(2).MethodFirst
  C.GetRandomClass<TSecondClass>().MethodSecond
...
Рейтинг: 0 / 0
17.08.2017, 16:52:37
    #39507015
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
К сожалению в таком виде не пойдет.

А можно использовать данную функцию в качестве Геттера? и как тогда описать свойство?
...
Рейтинг: 0 / 0
17.08.2017, 16:55:04
    #39507019
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Свойства дженерики в Delphi не поддерживаются. Только классы или методы.
...
Рейтинг: 0 / 0
17.08.2017, 16:55:59
    #39507021
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Расскажите всем, зачем вы пытаетесь отстрелить себе ногу?
Может вам надо не ZZZ, а XXX ? И решение совсем другое будет?
...
Рейтинг: 0 / 0
17.08.2017, 16:58:18
    #39507023
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
=)

Пытаюсь реализовать аналог ORM.
Есть базовый класс "Сущность" (Таблица)
Для реализации ссылки на другие объекты через Вторичный ключ хочу автоматизировать геттер и сеттер к этим объектам. Вручную реализовал, но там нужно по одной строчке (и в геттере и в сеттере) писать, а хотелось бы по-максимуму автоматизировать.
...
Рейтинг: 0 / 0
17.08.2017, 17:32:36
    #39507047
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  TMyClass = class
  private
   function  InternalGetter(Index: Integer) : TBaseClass;
   procedure InternalSetter(Index: Integer; aObject: TBaseClass);
   function  InternalGetter0 : TFirstClass;                              //inline
   procedure InternalSetter0 ( aObject: TFirstClass);                    //inline
   function  InternalGetter1 : TSecondClass;                             //inline
   procedure InternalSetter1 ( aObject: TSecondClass);                   //inline
  public
   property FirstClass : TFirstClass  read InternalGetter0 write InternalSetter0;
   property SecondClass: TSecondClass read InternalGetter1 write InternalSetter1;

   //////////////////////////////////////////////////////////////////////////////
   function Get<T:class> : T;
   function &Set<T:class> : PPointer;
  end;

  t := v.Get<TFirstClass>;
  v.&Set<TSecondClass>^ := tt;
...
Рейтинг: 0 / 0
17.08.2017, 17:59:16
    #39507070
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
  TA = class
  end;

  T1 = class(TA)
  end;

  T2 = class(TA)
  end;

  TMy = class
  private
    type
      TWrapper = record
      private
        FObject: TValue;
      public
        constructor Create(aObject: TA);
        function AsObject<T>: T;
      end;
    function GetA(const Index: Integer): TWrapper;
  public
    property A1: TWrapper index 0 read GetA;
    property A2: TWrapper index 1 read GetA;
  end;

{ TMy.TWrapper }

function TMy.TWrapper.AsObject<T>: T;
begin
  Result := FObject.AsType<T>;
end;

constructor TMy.TWrapper.Create(aObject: TA);
begin
  FObject := aObject;
end;

{ TMy }

function TMy.GetA(const Index: Integer): TWrapper;
var
  FList: TList;
begin
  Result := TWrapper.Create(FList.Items[Index]);
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
  TMy.Create().GetA(1).AsObject<T1>.First
end;
...
Рейтинг: 0 / 0
18.08.2017, 07:48:59
    #39507253
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Спасибо, но нет это не подходит. как я уже писал выше, хочу сделать аналог ORM, и чтобы конечный пользователь данной ОРМ мог нормально использовать описанные объекты.
...
Рейтинг: 0 / 0
18.08.2017, 08:42:26
    #39507270
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Конечный пользователь будет самостоятельно программировать ?
...
Рейтинг: 0 / 0
18.08.2017, 08:48:32
    #39507274
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
Не путайте =).
Я написал "Конечный пользователь данной ОРМ", т.е. программист, использующий этот инструмент а не пользователь итогового продукта. (Хотя возможно это я не правильно выразился =) что тоже не исключаю).

Смысл в том что имеется группа программистов, у каждого свое направление и свои таблицы, свой набор объектов.
Чтобы им было удобнее описать объекты я пытаюсь все по максимуму автоматизировать, что предотвратит лишний код и соответственно лишние ошибки, ну и стандартизацию.
...
Рейтинг: 0 / 0
18.08.2017, 08:50:01
    #39507276
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTTI один геттер для различных свойств, являющихся потомком одного класса.
блин. ошибся ".. и стандартизирует код."
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RTTI один геттер для различных свойств, являющихся потомком одного класса. / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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