Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.003 c
2-1292336344
vitge
2010-12-14 17:19
2011.03.06
Закрытие формы из другой формы


3-1254752327
man Yury
2009-10-05 18:18
2011.03.06
Как в динамический запрос передать значение null


15-1290634183
Юрий
2010-11-25 00:29
2011.03.06
С днем рождения ! 25 ноября 2010 четверг


4-1245942576
erglnu
2009-06-25 19:09
2011.03.06
TrackPopupMenu + Трей - Меню не убирается((


3-1253856043
vegarulez
2009-09-25 09:20
2011.03.06
[SQL, MS Access] Вопрос про CREATE TABLE. Формат полей.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский