Форум: "Начинающим";
Текущий архив: 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.005 c