powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RTTI один геттер для различных свойств, являющихся потомком одного класса.
20 сообщений из 20, страница 1 из 1
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39506890
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Имеется базовый класс
Код: 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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39506982
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39506986
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но в последующем у каждого потомка будут свои методы и нужно будет их использовать, а каждый раз приводить к нужному типу накладно.
может есть способ тогда при обращении к свойству указать его тип?
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39506987
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39506991
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxJr,

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

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

Нет, не известно.
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507007
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507012
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,

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



тогда не получится
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507013
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507015
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению в таком виде не пойдет.

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

Пытаюсь реализовать аналог ORM.
Есть базовый класс "Сущность" (Таблица)
Для реализации ссылки на другие объекты через Вторичный ключ хочу автоматизировать геттер и сеттер к этим объектам. Вручную реализовал, но там нужно по одной строчке (и в геттере и в сеттере) писать, а хотелось бы по-максимуму автоматизировать.
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507047
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507070
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507253
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но нет это не подходит. как я уже писал выше, хочу сделать аналог ORM, и чтобы конечный пользователь данной ОРМ мог нормально использовать описанные объекты.
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507270
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечный пользователь будет самостоятельно программировать ?
...
Рейтинг: 0 / 0
RTTI один геттер для различных свойств, являющихся потомком одного класса.
    #39507274
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не путайте =).
Я написал "Конечный пользователь данной ОРМ", т.е. программист, использующий этот инструмент а не пользователь итогового продукта. (Хотя возможно это я не правильно выразился =) что тоже не исключаю).

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


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