Вниз
Скачать: CL | DM;

ООП   Найти похожие ветки 

← →
v2 ©   (2010-12-13 03:10) [0]

Можно ли создать (вызвать Create) дочерний объект из базового класса?


← →
Юрий Зотов ©   (2010-12-13 03:25) [1]

Без проблем. Может потребоваться опережающее объявление дочернего класса.


← →
Ega23 ©   (2010-12-13 08:03) [2]

Можно. Но вопрос поставлен некорректно, требуется уточнение.


← →
v2 ©   (2010-12-13 14:22) [3]

Базовый класс должен автоматизировать создание дочерних объектов из потока входящих данных:
---------


unit A;

class procedure TBase.Load;
var
newTChild : Pointer; //?
begin
newTChild := TChild.Create; // ???
...
end;


-----------


unit B;

TChild=class(TBase);
...



← →
Ega23 ©   (2010-12-13 14:30) [4]

TAncestor = class (TObject)
public
 constructor Create; virtual;
end;

TAncestorClass = class of TAncestor;

TChild = class (TAncestor)
public
 constructor Create; override;
end;

TBase = class (.....)
 class procedure Load;
 property AncestorClass: TAncestorClass read FAncestorClass write FAncestorClass;
end;

class procedure TBase.Load;
begin
 with FAncestorClass.Create do
 begin

 end;
end;


← →
Юрий Зотов ©   (2010-12-13 15:16) [5]

Добавление к [4]: поток входных данных должен содержать имя фактического дочернего класса, а сами дочерние классы должны быть зарегистрированы. Тогда, прочитав из потока имя класса, мы сможем создать его экземпляр.


← →
v2 ©   (2010-12-13 15:57) [6]

[4]: получаем TChild = class(TAncestor), а хотелось бы  TChild = class(TBase) и, по возможности, TBase должен быть в библиотечном модуле.

[5]: Идея такова: TChild где-нибудь в class procedure TChild.Init заполняет class var TBase.DataStruct offset"ами своих полей и их размерами, а TBase в Load (который будет вызван в TChild.Init) создает TChild"ов и наполняет.

Пока делаю через class var TBase.PtrToNewChildFunc

Но попутно еще вопрос:
Как сделать class var TBase.Var уникальной для разных классов наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.Var )


← →
Ega23 ©   (2010-12-13 16:06) [7]


> Пока делаю через class var TBase.PtrToNewChildFunc

Успехов.

@TChild01.TBase.Var <> @TChild02.TBase.Var

Орех.


← →
oxffff ©   (2010-12-13 16:08) [8]

Не смогу помочь.


← →
Юрий Зотов ©   (2010-12-13 17:01) [9]

> v2 ©   (13.12.10 15:57) [6]

> [5]: Идея такова: TChild где-нибудь в class procedure TChild.Init заполняет
> class var TBase.DataStruct offset"ами своих полей и их размерами

И что произойдет, если какое-то поле есть длинная строка, динамический масссив, объект или любой другой указатель? А ведь такое встречается часто.

> TBase в Load (который будет вызван в TChild.Init) создает TChild"ов и
> наполняет.

Почему бы не использовать стандартную сериализацию VCL? См.справку по классу TPersistent.

> Как сделать class var TBase.Var уникальной для разных классов
> наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.Var )

Прочитал. Долго думал. Не понял. Так 3 раза. Все равно ничего не понял. ТАКОГО языка я просто не знаю.

Что такое class var?
Что такое var TBase?
Что такое TBase.Var?
Зачем здесь взятие адреса?
Что такое TChild01.TBase?


← →
_Юрий   (2010-12-13 20:49) [10]


> Юрий Зотов ©   (13.12.10 17:01) [9]


> Что такое class var?


Это новый синтаксис - классовая переменная
по экземпляру на класс


> Как сделать class var TBase.Var уникальной для разных классов
> наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.
> Var )


Никак.
Сделайте виртуальные классовые методы, которые возвращают в потомках другие экземпляры переменной


← →
_Юрий   (2010-12-13 20:51) [11]


> Сделайте виртуальные классовые методы, которые возвращают
> в потомках другие экземпляры переменной


А саму переменную соответственно уберите (если она долнга быть разной для разных потомков).


← →
v2 ©   (2010-12-14 16:26) [12]

Спасибо!
Немного поковырялся  :
[2]:
>Можно. (!)
В нестатическую процедуру класса передается скрытый параметр , который есть "тип объекта", - тесть можно вот так:

TBase =class;
TChild= class(TBase)

class procedure TBase.Load;
var T:Pointer;
begin
 T:=Self.Create;      // => TChild.Create  (!)
 ObjsList.Add(t);
end;

class procedure TBase.Fin;
var T:Pointer;
begin
 Save;
 …
T:= ObjsList[i];
(TObject(T) as Self).Free;    //=> TChild.Free( hidden ( T =>object Self) )  (!)
 ObjsList.Extract(T);
 …
end;

class procedure TChild.Init;
begin
...
Load;  // =>  TBase.Load
end;

[10]:
>Никак. (?)
Можно, но "руками", используя тот же class Self в качестве идентификатора текущего дочернего класса…

Попозже покажу где-то примерчик.


← →
Ega23 ©   (2010-12-14 16:51) [13]

(TObject(T) as Self).Free;
Бьюсь башкой об клаву...

Free - статичный метод TObject.


← →
v2 ©   (2010-12-14 17:46) [14]

[13]:
>Free - статичный метод TObject.
Кто сказал?

>> TChild.Free( hidden ( T =>object Self) )
Можно понимать как:
Вызов procedure TChild.Free; с передачей в нее скрытого параметра Т, который в самой Free будет признан за Self


← →
Игорь Шевченко ©   (2010-12-14 19:03) [15]


> Кто сказал?


объявление в System.pas


← →
Ega23 ©   (2010-12-14 21:53) [16]


> Кто сказал?

Пушкин.


> Вызов procedure TChild.Free; с передачей в нее скрытого
> параметра Т, который в самой Free будет признан за Self


Пипец.
Чувак, ты хинты и ворнинги читаешь? Или чукча не читатель, чукча писатель?


← →
v2 ©   (2010-12-14 23:35) [17]

[16]:
>хинты и ворнинги читаешь?

http://v2.nm.ru/toforum.rar

Отпишешься о хинтах.


← →
Ega23 ©   (2010-12-15 00:13) [18]

Я ещё не совсем из ума выжил, чтобы качать на свою машину неизвестно что от неизвестно кого.

Теперь, что касается v2 ©   (14.12.10 16:26) [12]

За такой код надо ноги отрывать. Мало того, что ты делаешь миллион ненужных действий в class procedure TBase.Fin;
Ты ещё внутри классового метода позволяешь обращаться к внешней сущности (я об ObjsList).
Класс - это чёрный ящик.Он ничего не должен знать об внешнем мире. Он оперирует только тем, что ему делегировали извне.


← →
Игорь Шевченко ©   (2010-12-15 00:44) [19]


> В нестатическую процедуру класса передается скрытый параметр
> , который есть "тип объекта",


Turbo Vision изобретаешь ?


← →
v2 ©   (2010-12-15 00:55) [20]

[18]:
>Я ещё не совсем из ума выжил, чтобы качать на свою машину неизвестно что от неизвестно кого.

А эту страничку не боишься открывать?

>За такой код ...
Да, я уже заметил, что тут достаточно резоголов и отрывоногов.

>..миллион..
Неохота в каждом дочернем классе один и тот же, в сущности, код прописывать.

>..сущности..
Код схематический, - от реального Вы отказались.

Я бы продолжил, для разминки, да спать охота.


← →
Германн ©   (2010-12-15 01:41) [21]


> А эту страничку не боишься открывать?

Тут скорее не боязнь, а отсутствие интереса. ИМХО


← →
Ega23 ©   (2010-12-15 07:37) [22]


> Неохота в каждом дочернем классе один и тот же, в сущности,
>  код прописывать.


Тебе уже показали, каким образом это делается. Тебе уточнили, что нужно ещё дополнительно сделать. Но нет, мы не ищем лёгких путей, мы будем рвать гланды через анус.


← →
Anatoly Podgoretsky ©   (2010-12-15 09:03) [23]

> Ega23  (15.12.2010 00:13:18)  [18]

И еще в неизвестном, коммерческом формате. Нормальные люди соблюдают
нетикет, по которому это должен быть .zip, А такие вещи прямиком
отправляются в корзину.


← →
Ega23 ©   (2010-12-15 10:04) [24]


> коммерческом формате


rar - открытый формат. Вот программа WinRar - таки платная. Впрочем, как и WinZip. А сама dll - пожалуйста, со всеми API.


← →
Anatoly Podgoretsky ©   (2010-12-15 10:05) [25]

> Ega23  (15.12.2010 10:04:24)  [24]

А нафига мне покупать WinZip?


← →
Ega23 ©   (2010-12-15 10:18) [26]


> А нафига мне покупать WinZip?


А нафига мне покупать WinRar? Он, правда, и так купленый, типа, стандарт корпоративный, но я им не пользуюсь. Он у меня в TotalCommander уже прошит.


← →
Игорь Шевченко ©   (2010-12-15 10:19) [27]


> Он у меня в TotalCommander уже прошит


а TotalCommander ты тоже купил ?


← →
Ega23 ©   (2010-12-15 10:28) [28]


> а TotalCommander ты тоже купил ?


Да.


← →
Anatoly Podgoretsky ©   (2010-12-15 10:30) [29]

> Ega23  (15.12.2010 10:18:26)  [26]

Я к тому, что zip встроен в Виндоус, и это улучшеный WinZip


← →
Ega23 ©   (2010-12-15 10:55) [30]

Так он же и рар понимает? Или я ошибаюсь?
Впрочем неважно. Формат - бесплатный, есть все dll, есть все интерфейсы, есть описание формата. Визуальные программы, его использующие могут быть платными.


← →
Anatoly Podgoretsky ©   (2010-12-15 11:24) [31]

> Ega23  (15.12.2010 10:55:30)  [30]

Ошибаешься, RAR коммерческий формат, и автор никому не дает ни алгоритм ни
внутренний формат для записи, и Микрософт не покупало это, на фига им мало
распространеный формат, в осном известный на одной шестой суши. А вот
лицензию на WinZip она включила.

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

Но я сообственно не про это, а про то что неэтично выкладывать в Интернете в
таком формате. Де факто стандарты для Интернет это .zip, .cab и .msi для
программ.
Например я даже и пытаться скачать и открыть делать не буду и многие также
поступают. Не умеешь соблюдать правила и мы тоже не будет твое читать.


← →
Ega23 ©   (2010-12-15 11:31) [32]


> ни внутренний формат для записи

Ну я спорить не буду, но мне кажется, что ты ошибаешься.
Насколько мне известно, алгоритм запатентован, но не скрыт.
Внутреннее описание тоже есть, вот: http://www.win-rar.ru/support/knowledge/detail.php?ID=1081


← →
Anatoly Podgoretsky ©   (2010-12-15 11:58) [33]

Ты считаешь, что этого описания достаточно для создания альтернативного архиватора. При это от обязанности покупать лицензию у владельца патента никто не отменял.

Иначе бы этих RAR архиваторов уже был бы вагон и маленькая тележка.
Ну и какое отношение это имеет к поведению в Интернет.


← →
Ega23 ©   (2010-12-15 12:05) [34]


> При это от обязанности покупать лицензию у владельца патента
> никто не отменял.


Тебе никто не мешает купить у владельца лицензию и встроить её в свою бесплатную тулзу.  :))))

> Ну и какое отношение это имеет к поведению в Интернет.

Не, с нетикетом я с тобой польностью солидарен. Моветон.


← →
Anatoly Podgoretsky ©   (2010-12-15 12:31) [35]

> Ega23  (15.12.2010 12:05:34)  [34]

Ты все время предлагаешь какие то подозрительные варианты. Ну их нафиг, а
мне же достаточно не нажимать на ссылку.


← →
v2 ©   (2010-12-15 13:02) [36]

[17]: http://v2.nm.ru/toforum.zip

[22]:
>Тебе уже показали, каким образом это делается.
Подслеп маленько, повторитесь, коли не сложно.


← →
v2 ©   (2010-12-15 13:04) [37]

http://v2.nm.ru/ToForum.zip


← →
Ega23 ©   (2010-12-15 13:05) [38]


> Подслеп маленько, повторитесь, коли не сложно.


[4]


>  http://v2.nm.ru/toforum.zip

Зря стараешься.


← →
Ega23 ©   (2010-12-15 13:06) [39]

Навеяло:
http://delphimaster.net/view/3-1292346820/


← →
v2 ©   (2010-12-15 13:59) [40]

[38]:
Код из [2] не работает,

[39]:
а в базах не силен я.


program df;

type
TDummy=class end;

TBase=class
 public
  constructor  Create;  virtual;
  procedure    Free;    virtual;
 public  class var fI   :Integer;
 public  class var Objs :array of Pointer;
 public  class procedure Load;
 public  class procedure Init;  virtual;
 public  class procedure Fin;   virtual;
end;

TChild=class(TBase)
 public
  fW         :Integer;
  procedure   Work;
  constructor Create; override;
  procedure   Free;   override;
 public  class procedure Init;  override;
 public  class procedure Fin;   override;

 public  class function Objs(i:Integer):TChild;
 public  class function ObjC:Integer;
end;

//-------------
constructor TBase.Create;
begin
Objs[fI]:=Self;
end;

class procedure TBase.Fin;
var
i:Integer;
begin
for i := Length(Objs)-1 downto 0 do
 (TDummy(Objs[i]) as Self).Free;
Finalize(Objs);
end;

procedure TBase.Free;
begin
inherited;
end;

class procedure TBase.Init;
begin
SetLength(Objs,10);
end;

class procedure TBase.Load;
var
i: Integer;
begin
for i := Length(Objs)-1 downto 0 do
 Self.Create;
end;

//------------
constructor TChild.Create;
begin
inherited;
Inc(fI);
end;

class procedure TChild.Fin;
begin
inherited;
end;

procedure TChild.Free;
begin
inherited;
end;

class procedure TChild.Init;
begin
fI:=0;
inherited;
Load;
end;

class function TChild.ObjC: Integer;
begin
Result:=Length(TBase.Objs);
end;

class function TChild.Objs(i: Integer): TChild;
begin
Result:=TBase.Objs[i];
end;

procedure TChild.Work;
begin
fW:=1;
end;
//---------------
var
i:Integer;
begin
TChild.Init;
for i:=TChild.ObjC-1 downto 0 do
 TChild.Objs(i).Work;
TChild.Fin;
end.



Страницы: 1 2 вся ветка

Скачать: CL | DM;



Память: 0.55 MB
Время: 0.007 c
3-1254417573
Дмитрий
2009-10-01 21:19
2011.03.06
Firebird-клиент 2.1 и Windows vista


8-1205319739
PMak
2008-03-12 14:02
2011.03.06
Вывод текста на изображение игры


2-1291905273
Vidog
2010-12-09 17:34
2011.03.06
Embedded-файлы


6-1235570827
Empleado
2009-02-25 17:07
2011.03.06
Уточнение по select


15-1290202186
Юрий
2010-11-20 00:29
2011.03.06
С днем рождения ! 20 ноября 2010 суббота




   Наверх