Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];
ВнизООП Найти похожие ветки
← →
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.
← →
Ega23 © (2010-12-15 14:03) [41]
> Код из [2] не работает,
Он работает.
> а в базах не силен я.
А дело не в базах, а в самом обсуждении. Там топикстартеру правильный ответ был даден сразу, но он упорно настаивал, что "всё и так работает, вот только если мышкой выбрать дату, но иногда не работает".
Мой тебе совет: забудь на время про классовые методы. Ты ещё до них не дорос.
← →
v2 © (2010-12-15 14:09) [42][41]:
>Он работает.
Приведи, пожалуйста, так как в [40], пример.
← →
Ega23 © (2010-12-15 14:14) [43]
> Приведи, пожалуйста, так как в [40], пример.
В [40] написан бред. Написан человеком, который "слышал звон, да не знает где он".
Есть мнение, что так, как в [40] тебе никто не напишет. Ни на этом форуме, ни на каком-либо другом.
← →
v2 © (2010-12-15 14:57) [44][43]:
> что так, как в [40]
Пожалуйста, так как в [40], простенький, но работоспособный пример, отображающий Ваш взгляд на решения вопроса.
Спасибо огромное, за Вашу помощь и участие.
← →
Ega23 © (2010-12-15 15:15) [45]
> отображающий Ваш взгляд на решения вопроса.
Я вопроса так и не услышал.
Можно ли создать (вызвать Create) дочерний объект из базового класса?
Да, можно. Как это делается - тебе уже написали. То, что требуется более конкретное уточнение - тебе тоже написали.
Если ты не умеешь задавать вопросы, не удивляйся ответу "42".
← →
v2 © (2010-12-15 16:23) [46][2]:
>Можно.
[45]:
>Я вопроса так и не услышал.
[2]:
>Но вопрос поставлен некорректно, требуется уточнение.
Какого рода уточнения Вам необходимы?
А если все-таки как-то можно, то приведите еще раз пример, потому как:
[4]:
>class procedure TBase.Load;
>begin
> with FAncestorClass.Create do // E2124 Instance member "FAncestorClass" inaccessible here
> begin
>
> end;
>end;
← →
clickmaker © (2010-12-15 16:26) [47]> А если все-таки как-то можно, то приведите еще раз пример,
> потому как:
>
> [4]:
>
> >class procedure TBase.Load;
> >begin
> > with FAncestorClass.Create do // E2124 Instance member
> "FAncestorClass" inaccessible here
> > begin
> >
> > end;
> >end;
а где и как объявлено FAncestorClass?
← →
Ega23 © (2010-12-15 16:33) [48]
> А если все-таки как-то можно, то приведите еще раз пример,
> потому как:
Очень просто. Это - классовый метод. Со всеми вытекающими последствиями.
А FAncestorClass - это приватное поле экземпляра класса.
Разницу чуешь?
← →
v2 © (2010-12-15 16:33) [49][4]:
>TBase = class (.....)
> class procedure Load;
> property AncestorClass: TAncestorClass read FAncestorClass write FAncestorClass;
>end;
← →
v2 © (2010-12-15 16:35) [50]Re [48]
Чую, но как применить Ваш пример?
← →
Ega23 © (2010-12-15 16:51) [51]
> Чую, но как применить Ваш пример?
Заменить class procedure Load на просто procedure Load
Я опечатался.
А тебе пока забыть о существовании классовых методов и переменных. Сначала с обычными разберись.
← →
v2 © (2010-12-15 17:15) [52]Ok, забыл о существовании классовых методов и переменных.
На Ваш пример [4] был такой отзыв:
[6]:
>> [4]: получаем TChild = class(TAncestor), а хотелось бы TChild = сlass(TBase)
Вы это как-то прокомментируете?
← →
Ega23 © (2010-12-15 17:31) [53]
> Вы это как-то прокомментируете?
Я уже перестал понимать твой полёт мысли.
Изложи чётко и по пунктам: что ты хочешь получить.
Без собственных догадок, как это сделать, без кода. Чётко и словами.
← →
v2 © (2010-12-15 17:48) [54]Спасибо за диалог, чуть позже (+4 часа) изложу суть вопроса.
← →
Ega23 © (2010-12-15 17:50) [55]
> Спасибо за диалог, чуть позже (+4 часа) изложу суть вопроса.
Хорошо, из дома вечером посмотрю.
← →
KSergey © (2010-12-15 22:14) [56]> Игорь Шевченко © (15.12.10 10:19) [27]
> а TotalCommander ты тоже купил ?
Предлагаю спросить еще про налоги.
← →
v2 © (2010-12-16 01:15) [57]Что есть:
Процедура, которой необходимо передать:
- имя файла;
- указатель на динамический массив целых со знаком (массив смещений);
- указатель на функцию обратного вызова (должна возвратить указатель на блок памяти);
- указатель, будет передан в функцию обратного вызова.
Процедура открывает файл, проверяет наличие в нем данных и вызывает функцию обратного вызова, которая возвращает ей указатель, с которым дальше и работает процедура.
Примитивно, - копирует в (полученный указатель + смещениям с массива) порции данных с файла. Если массив смещений иссяк, а данные в файле есть – продолжаем с процедуры обратного вызова, переместившись в начало массива смещений. Если же данных в файле больше нет, то и все.
Что нужно:
Как-то записывать все то, что напередавала функция обратного вызова процедуре
Как нужно:
Чтобы вся рутинная работа выполнялась подальше, а "мы" примазались бы к работягам, сказав, что функция теперь работает только на `нас` и имя файла теперь "наш", заполнили бы массив смещений и инициировали вызов процедуры.
При этом таких "мы" может быть много, и они потом желают видеть только "своих" - записи-результаты функции.
ЗЫ
Словами получилось, четко - нет.
ЗЗЫ
Вот теперь это точно бред, … срочно спать.
← →
Германн © (2010-12-16 01:57) [58]
> v2 © (16.12.10 01:15) [57]
И при чём тут ООП?
← →
Servy © (2010-12-16 08:35) [59]
> Процедура, которой необходимо передать:
> - имя файла;
> - указатель на динамический массив целых со знаком (массив
> смещений);
> - указатель на функцию обратного вызова (должна возвратить
> указатель на блок памяти);
> - указатель, будет передан в функцию обратного вызова.
Боюсь, вы в очередной раз изложили не задачу, а ваш способ решения. Хорошая задача могла бы звучать так:
Хочу уметь сохранять и загружать свои объекты, а именно значения их свойств, в файл. Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла требовался минимум усилий. На такой вопрос, к примеру, ответ в ветке был дан.
То, что вы излагаете содержит какие-то массивы, указатели и прочие сущности, а нафига вы хотите их нагородить - не разъяснено. До выяснения, боюсь вам тут никто не поможет.
← →
Ega23 © (2010-12-16 10:00) [60]
> Боюсь, вы в очередной раз изложили не задачу, а ваш способ
> решения.
Да не, задача изложена нормально. Процедура, указатель из callback-функции, буфер данных.
Это всё понятно и никакого отношения к ООП не имеет.
> Чтобы вся рутинная работа выполнялась подальше, а "мы" примазались
> бы к работягам, сказав, что функция теперь работает только
> на `нас`
Ну а вот дальше я нихрена не понял. Кто "мы"? Кого "нас"? Какие "работяги"?
Кто все эти люди?
← →
v2 © (2010-12-16 13:47) [61]>Это всё понятно и никакого отношения к ООП не имеет
Так я и хочу все это дело завернуть в ООП.
>Ну а вот дальше я нихрена не понял. Кто "мы"? Кого "нас"?
Просили "без кода", - это, один и тот же тип объектов.
>Какие "работяги"?
Базовый класс.
>Хорошая задача могла бы звучать так:
>Хочу уметь сохранять и загружать свои объекты, а именно значения их свойств, в файл.
>Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла
>требовался минимум усилий.
Ага, спасибо за понимание, и чтобы потом все загруженные объекты были под рукой, и при минимуме усилий освобождались при завершении.
>На такой вопрос, к примеру, ответ в ветке был дан.
Вы говорите о "[9]: См. справку по классу TPersistent." ?
Но у меня уже есть "мое, родное", и работает оно. И уже завернуто в ООП.
И мой ответ на мой вопрос [1] такой:
Self.Create; для не статичного классового метода
Но код мой [40] мастерами не признан был.
Вот и вопрос:
Как же такие ("Хорошая задача") задачи решают мастера и что не так в коде [40] ?
← →
Ega23 © (2010-12-16 14:05) [62]Я уже было понадеялся, что началось адекватное обсуждение.
А нет. Опять бредни про ООП, опять "статичные классовые методы", опять "Self.Create".
Лично мне - уже надоело. Даю последнюю попытку: объясни, что за задачу ты решаешь. Простыми словами, без своих догадок, как это надо сделать.
← →
v2 © (2010-12-16 14:48) [63]>Я уже было понадеялся, что началось адекватное обсуждение.
Я тоже.
>"статичные классовые методы"
поправка:
>>не статичного классового метода
: классового метода без спецификатора static;
>> Self.Create;
работает, и решает задачу, а именно
>Простыми словами:
Надо вызвать конструктор наследника из базового класса.
Ваши комментарии.
← →
Ega23 © (2010-12-16 15:09) [64]Попытка использована.
За сим - откланиваюсь.
← →
v2 © (2010-12-16 15:41) [65]>За сим - откланиваюсь.
Увы, рассказали, что все плохо, ничем не помогли, и убежали.
_Юрий, спасибо!
> Сделайте виртуальные классовые методы, которые возвращают
> в потомках другие экземпляры переменной
Натолкнуло на мысль, которая помогла найти решение, хотя непосредственно Вашим советом и не воспользовался.
← →
Inovet © (2010-12-16 15:50) [66]> [65] v2 © (16.12.10 15:41)
> Увы, рассказали, что все плохо, ничем не помогли, и убежали.
Так ты ничего не рассказал
> [62] Ega23 © (16.12.10 14:05)
> объясни, что за задачу ты решаешь. Простыми словами, без
> своих догадок, как это надо сделать.
но снова про то как ты это делаешь
> [63] v2 © (16.12.10 14:48)
> Надо вызвать конструктор наследника из базового класса.
← →
v2 © (2010-12-16 16:06) [67]Servy, Спасибо! Воспользуюсь Вашим постом.
>Требуется создать такой класс, чтобы при наследовании от него для сериализации объекта и загрузки его назад из файла
>требовался минимум усилий.
[63]:
>но снова про то как ты это делаешь
>> Надо вызвать конструктор наследника из базового класса.
Да, и в решении такой задачи меня смущало именно это.
А как бы Вы решали такую задачу?
← →
icWasya © (2010-12-16 16:21) [68]>А как бы Вы решали такую задачу?
Ну так задачу ты и неозвучил.
← →
Ega23 © (2010-12-16 16:21) [69]Во, вот теперь всё ясно. Задачка стандартная, по сериализации различных объектов. Встречается довольно регулярно. Решается тоже довольно просто.
Только вот незадача: последняя попытка была использована.
← →
Anatoly Podgoretsky © (2010-12-16 16:56) [70]> icWasya (16.12.2010 16:21:08) [68]
Ну что вы пристали, ну не может он.
← →
v2 © (2010-12-16 17:01) [71][0]:
>>Можно ли создать (вызвать Create) дочерний объект из базового класса?
[2]:
>Можно. Но вопрос поставлен некорректно, требуется уточнение.
[3]:
>> Базовый класс должен автоматизировать создание дочерних объектов из потока входящих данных
[4]:
>TChild = class (TAncestor)
>public
> constructor Create; override;
>end;
>TBase = class (.....)
> class procedure Load;
> property AncestorClass: TAncestorClass read FAncestorClass write >FAncestorClass;
>end;
[6]:
>>получаем TChild = class(TAncestor), а хотелось бы TChild = сlass(TBase)
[22]:
>Тебе уже показали, каким образом это делается.
[69]:
>Во, вот теперь всё ясно. Задачка стандартная, по сериализации различных объектов.
Прошу прощения за настойчивость, прокомментируйте кто-нибудь код (D2009) из поста [40]. Спасибо.
← →
Amoeba_ (2010-12-16 17:05) [72]В итоге имеем очередную сагу об X, Y и Z:
http://www.gunsmoker.ru/2008/10/x-y-z.html
← →
Ega23 © (2010-12-16 17:15) [73]
> В итоге имеем очередную сагу об X, Y и Z:
Да, в яблочко.
← →
v2 © (2010-12-16 17:22) [74]Re: [72],[73]
Вам, наверное, здесь пряники раздают за количество постов, или как.
← →
Юрий Зотов © (2010-12-16 19:28) [75]
> v2 ©
Если Вам нужна всего лишь сериализация объектов, то зачем изобретать велосипед, когда в Delphi она есть уже готовая?
Кроме того, Вы идете не только нерациональным, но еще и заведомо неверным путем - та сериализация, которую Вы хотите сделать работать не будет, потому что среди полей объекта запросто могут быть длинные строки, динамические масссивы, объекты или любые другме указатели. Сериализовывать такие поля по принципу смещение+размер просто бессмысленно.
Не вдумались Вы в [9] - а зря, сами себя на три дня наказали.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.005 c