Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Задать тип поля в конструкторе класса / 25 сообщений из 28, страница 1 из 2
02.03.2020, 13:04
    #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
02.03.2020, 13:05
    #39932954
b0rk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задать тип поля в конструкторе класса
Дженерики?
...
Рейтинг: 0 / 0
02.03.2020, 14:38
    #39933013
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задать тип поля в конструкторе класса
Если старовер, то Variant
...
Рейтинг: 0 / 0
02.03.2020, 15:07
    #39933022
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задать тип поля в конструкторе класса
woojin,

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

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

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

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

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

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

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

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


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


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


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

Если машина не едет, это не повод собирать свою собственную из старой двери и роликовых коньков.
...
Рейтинг: 0 / 0
03.03.2020, 10:47
    #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
03.03.2020, 11:06
    #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
03.03.2020, 11:29
    #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
03.03.2020, 11:45
    #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
03.03.2020, 12:03
    #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
03.03.2020, 15:26
    #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
03.03.2020, 15:41
    #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
03.03.2020, 18:37
    #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
04.03.2020, 09:40
    #39933889
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задать тип поля в конструкторе класса
woojin

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

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

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

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

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

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


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