powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Задать тип поля в конструкторе класса
25 сообщений из 28, страница 1 из 2
Задать тип поля в конструкторе класса
    #39932952
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет!
пришел в голову "бред" (по другому не назвать), но... а вдруг... такое возможно

создать класс с не типизированной переменной(классa), тип которой задаётся на стадии constructor данного класса и потом уже используется заранее подготовленный класс под указанный тип

Код: 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.
type
  TZapis = class
  public
    value: "не известный пока тип"
    constructor Create(typ: string);
  end;

  TSpisok = class
    name: string;
    zapis: TZapis;
  public
    constructor Create(nam, typ: string);
    property zap: TZapis read zapis write zapis;
  end;

  TZapString = class
    val: string;
    function Trim: string;
  end;

constructor TZapis.Create(typ: string);
begin
  if typ = 'string' then
    value := TZapString.Create;
end;

constructor TSpisok.Create(nam, typ: string);
begin
  name := nam;
  zapis := TZapis.Cpeate(typ);
end;

function TZapString.Trim: string;
begin
  Result := System.Trim(val);
end;



использование
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  spisok: TSpisok;

begin
  spisok := TSpisok.Create('новый', 'string');
  spisok.zap := '   какая то новая запись в списке   ';
  spisok.zap.Trim;
end;



интересует, есть ли возможность создать такую переменную (value) как в классе TZapis или это дичайший бред?
P.S. типы могут быть абсолютно разными и к каждому из них можно придумать свои функции
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39932954
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дженерики?
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933013
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если старовер, то Variant
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933022
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Это не класс, а шаблон Фабрика (Фактори)

https://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933045
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
пришел в голову "бред" (по другому не назвать), но... а вдруг... такое возможно

А цель именно реализовать бред или всё-таки решить какую-либо практическую задачу? Если второе, то лучше описать саму задачу.
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933046
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
пришел в голову "бред" (по другому не назвать), но... а вдруг... такое возможно

А цель именно реализовать бред или всё-таки решить какую-либо практическую задачу? Если второе, то лучше описать саму задачу.
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933049
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще добавлю Pointer, и может быть Variant record. Хотя мои идеи уже купируют идею Variant
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933171
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
А цель именно реализовать бред или всё-таки решить какую-либо практическую задачу? Если второе, то лучше описать саму задачу.

цель?
не нравится мне TDataSet и все его поля и вообще как оно там устроено
если получится сделать мой вариант...
вроде должно быть проще при работе с такого типа информацией
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933174
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
b0rk
Дженерики?

вот сколько про них читал, так и не "вкурил" как при помощи них можно такое сделать(((
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933175
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
если получится сделать мой вариант...

То Вы проведёте несколько ближайших лет за крайне интересной задачей разработки велосипеда, кардинально уступающего уже имеющемуся. Если намерены делать это за свой счёт - разумеется, делайте, если же за счёт зарплаты...
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933277
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer,

у имеющейся реализации реализации есть минус в количестве записей (точно не помню), то ли после N-ного количества тормозить начинает, то ли - ошибка переполнения возникает


P.S. и вообще хотелось бы для саморазвития
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933307
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
создать класс с не типизированной переменной(классa), тип которой задаётся на стадии constructor данного класса и потом уже используется заранее подготовленный класс под указанный тип


Может, поковыряться в DevExpress и там посмотреть, как сделано свойство Properties?
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933309
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
создать класс с не типизированной переменной(классa), тип которой задаётся на стадии constructor данного класса и потом уже используется заранее подготовленный класс под указанный тип


Сделать переменную типа TObject и тогда создавай там любой класс.
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933311
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё всякие скриптеры, например FastScript или Pascal Analyzer. Может там можно подсмотреть?
А может даже не подсматривать, а просто взять и их использовать?
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933348
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
у имеющейся реализации реализации есть минус в количестве записей (точно не помню), то ли после N-ного количества тормозить начинает, то ли - ошибка переполнения возникает

Если машина не едет, это не повод собирать свою собственную из старой двери и роликовых коньков.
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933361
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
b0rk
Дженерики?

вот сколько про них читал, так и не "вкурил" как при помощи них можно такое сделать(((

Код: 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.
type
  TMyClass<T> = class
  private
    FValue: T;
  public
    constructor Create(Value: T);

    property Value: T read FValue;
  end;

implementation

{ TMyClass<T> }

constructor TMyClass<T>.Create(Value: T);
begin
  FValue := Value;
end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  MyStrCalss: TMyClass<string>;
  MyIntClass: TMyClass<integer>;
begin
  MyStrCalss := TMyClass<string>.Create('Hello');
  MyIntClass := TMyClass<integer>.Create(10);
end;
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933378
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
Сделать переменную типа TObject и тогда создавай там любой класс.

попробовал этот вариант

я чего то не догоняю - почему нет свойств потомка в получившемся экземпляре (кстати если делать "фабрикой" - то же их нет)

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
type
  TZapis = class
  protected
    name: string;
  end;

type
  TStringZapis = class(TZapis)
    value: string;
  protected
    name: string;
  public
    property val: string read value write value;
  end;

type
  TSpisok = class
// временное решение с массивом, заменить
    spis: array of TZapis;
  public
    function NewZapis: TZapis; virtual; abstract;
  end;

type
  TSpis = class(TSpisok)
    typ: string;
  public
    function NewZapis: TZapis; override;
  end;

type
  TStringSpisok = class(TSpisok)
  public
    function NewZapis: TZapis; override;
  end;

.............................

function TSpis.NewZapis: TZapis;
var
  spisok: TSpisok;
  len: integer;

begin
  len := Length(spis);
  SetLength(spis, len + 1);

  try
    if typ = 'string' then
      begin
        spisok := TStringZapis.Create;
        spis[len] := spisok.NewZapis;
      end;
  finally
    spisok.Free;
  end;
end;

function TStringZaspis.NewZapis: TZapis;
begin
  Result := TStringZapis.Create;
end;

.............................

var
  spisok: TSpis;
  s, ClasNam: string;

begin
  spisok := TSpis.Create;
  spisok.typ := 'string';
  spisok.NewZapis;

  s := spisok.spis[0].val;    // вообще такого свойства нет!
  ClasNam := spisok.spis[0].ClassName;    // а вот класс правильный "TStringZapis"
end;
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933395
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin

попробовал этот вариант

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
type
  TZapis = class
  protected
    name: string;  // нет свойства value 
  end;

type
  TStringZapis = class(TZapis)
    value: string;
  protected
    name: string;
  public
    property val: string read value write value;
  end;

type
  TSpisok = class
// временное решение с массивом, заменить
    spis: array of TZapis; // Массив TZapis, у которого нет свойства value
  public
    function NewZapis: TZapis; virtual; abstract;
  end;

type
  TSpis = class(TSpisok)
    typ: string;
  public
    function NewZapis: TZapis; override;
  end;

type
  TStringSpisok = class(TSpisok)
  public
    function NewZapis: TZapis; override;
  end;

.............................

function TSpis.NewZapis: TZapis;
var
  spisok: TSpisok;
  len: integer;

begin
  len := Length(spis);
  SetLength(spis, len + 1);

  try
    if typ = 'string' then
      begin
        spisok := TStringZapis.Create;
        spis[len] := spisok.NewZapis;
      end;
  finally
    spisok.Free;
  end;
end;

function TStringZaspis.NewZapis: TZapis;
begin
  Result := TStringZapis.Create;
end;

.............................

var
  spisok: TSpis;
  s, ClasNam: string;

begin
  spisok := TSpis.Create;
  spisok.typ := 'string';
  spisok.NewZapis;

  s := spisok.spis[0].val;    // вообще такого свойства нет!  Потому что spisok.spis[0] - типа TZapis. Если привести к типу TStringZapis, то появится
  ClasNam := spisok.spis[0].ClassName;    // а вот класс правильный "TStringZapis"
end;

...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933408
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45

Код: pascal
1.
    name: string;  // нет свойства value 


тут его и не должно быть, оно же для каждого потомка своё (string, integer и т.д.)
goldmi45

Код: pascal
1.
    spis: array of TZapis; // Массив TZapis, у которого нет свойства value


оно должно быть у каждого элемента своё собсвенное(см. выше)
goldmi45

Код: pascal
1.
  s := spisok.spis[0].val;    // вообще такого свойства нет!  Потому что spisok.spis[0] - типа TZapis. Если привести к типу TStringZapis, то появится


тогда почему у этого элемента класс правильный "TStringZapis", а не "TZapis"?
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933425
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
goldmi45

Код: pascal
1.
    name: string;  // нет свойства value 


тут его и не должно быть, оно же для каждого потомка своё (string, integer и т.д.)
goldmi45

Код: pascal
1.
    spis: array of TZapis; // Массив TZapis, у которого нет свойства value


оно должно быть у каждого элемента своё собсвенное(см. выше)
goldmi45

Код: pascal
1.
  s := spisok.spis[0].val;    // вообще такого свойства нет!  Потому что spisok.spis[0] - типа TZapis. Если привести к типу TStringZapis, то появится


тогда почему у этого элемента класс правильный "TStringZapis", а не "TZapis"?

Потому, что TStringZapis является наследником TZapis.
Почитайте про наследование.
В массиве TZapis могут храниться объекты как TZapis типа, так и наследники этого типа. Но указано, что свойство spis - массив определённого класса (TZapis). Поэтому сразу и не получаете поля и свойства (в данном случае value или val), которые существуют только у наследников TZapis.
И ещё, то, что не описано ни в одной секции (поле value в классе TStringZapis), являются public.
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933588
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45

Почитайте про наследование.

ещё перед созданием поста читал и вроде сделал как "по инструкции"
goldmi45

В массиве TZapis могут храниться объекты как TZapis типа, так и наследники этого типа. Но указано, что свойство spis - массив определённого класса (TZapis).

переправил spis на TObject по идее должно было появится свойство val, но его как не было так и нет
goldmi45
Поэтому сразу и не получаете поля и свойства (в данном случае value или val), которые существуют только у наследников TZapis.

но тогда почему ClassName возвращает не TZapis, а TStringZapis?
goldmi45

И ещё, то, что не описано ни в одной секции (поле value в классе TStringZapis), являются public.

в public описана val (TStringZapis)
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933596
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
goldmi45

Почитайте про наследование.

ещё перед созданием поста читал и вроде сделал как "по инструкции"

Значит, не поняли.
woojin
goldmi45

В массиве TZapis могут храниться объекты как TZapis типа, так и наследники этого типа. Но указано, что свойство spis - массив определённого класса (TZapis).

переправил spis на TObject по идее должно было появится свойство val, но его как не было так и нет

Тогда и поле name пропадёт, т.к. у TObject нет поля name.
woojin
goldmi45
Поэтому сразу и не получаете поля и свойства (в данном случае value или val), которые существуют только у наследников TZapis.

но тогда почему ClassName возвращает не TZapis, а TStringZapis?

Потому что хранится TStringZapis, но получаете вы его как задекларировали массив - TZapis или TObject.
woojin
goldmi45

И ещё, то, что не описано ни в одной секции (поле value в классе TStringZapis), являются public.

в public описана val (TStringZapis)

В public описана val как свойство. Но поле value описана в неявной public-секции. Как вы думаете, почему можете обращаться к компонентам, которые бросили на форму из другого модуля, хотя они не перечислены в public-секции?
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933697
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45
Значит, не поняли.

с этим согласен - видимо где то не совсем дошло
goldmi45
Тогда и поле name пропадёт, т.к. у TObject нет поля name.

получается надо именно TZapis использовать
goldmi45
Потому что хранится TStringZapis, но получаете вы его как задекларировали массив - TZapis или TObject.

ну вот и всё ((( я окончательно потерялся - как тогда правильно декларировать, что бы получать именно свойства потомков?
goldmi45
В public описана val как свойство. Но поле value описана в неявной public-секции.

да, тут я немного упустил момент, надо было его(value) в privat записать
goldmi45
Как вы думаете, почему можете обращаться к компонентам, которые бросили на форму из другого модуля, хотя они не перечислены в public-секции?

вроде же обращение к этим компонентам происходит не напрямую, а через класс формы, типа (обращение из unit2)Form1.Button2 - через класс формы, но не как не (обращение из unit2)Button2 - напрямую
и даже так unit1.Button2 - то же не прокатит
или что то изменилось за последние несколько часов!
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39933889
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin

goldmi45
Потому что хранится TStringZapis, но получаете вы его как задекларировали массив - TZapis или TObject.

ну вот и всё ((( я окончательно потерялся - как тогда правильно декларировать, что бы получать именно свойства потомков?

Я говорил уже - приводить к нужному типу:
Код: pascal
1.
s := TStringZapis(spisok.spis[0]).val;
...
Рейтинг: 0 / 0
Задать тип поля в конструкторе класса
    #39934299
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45,

да... видимо только приведение или создание всех необходимых выходных параметров в базовом классе (типа TField)

а я так надеялся что может получится создать один базовый класс и добавлять к нему методы и переменные уже внутри дочерних классов
определять переменную как базовый класс, но Create делать от имени нужного мне дочернего класса и что бы у этой переменной появлялись уже методы и переменные дочернего класса

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


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