Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизВопрос по ООП Найти похожие ветки
← →
EG (2006-10-10 21:45) [0]Здравствуйте, не могли бы Вы мне ответить на такой вопрос:
есть что-то вроде
type
TClass1 = class (Tobject)
first: string;
A: THHHHObject;
end;
Некоторая функция в некотором месте программы возвращает А.
Вопрос: как, зная А, получить доступ к другим полям экземпляра класса TClass1?
Прим.: A.parent возвращяет не экземпляр класса TClass1, а другой объект.
Заранее благодарен за помощь.
← →
Ketmar © (2006-10-10 21:48) [1]бр-р-р. сам-то понял, что спросил?
← →
Leonid Troyanovsky © (2006-10-10 21:50) [2]
> EG (10.10.06 21:45)
> Вопрос: как, зная А, получить доступ к другим полям экземпляра
> класса TClass1?
Никак.
--
Regards, LVT.
← →
Kolan © (2006-10-10 21:52) [3]
> А, получить доступ к другим полям экземпляра класса TClass1?
Никак.
ЭкземплярTHHHHObject
- А просто поле классаTClass1
. Те жто композиция.
При такой структуре экземплярTHHHHObject
ничего знать не может оTClass1
. Его просто используют.
> Прим.: A.parent возвращяет не экземпляр класса TClass1,
> а другой объект.
Это я не понял..
← →
EG (2006-10-10 21:52) [4]Если у объекта Y полем является объект X, можно ли, зная X, получить доступ ко всем остальням полям, методам, свойствам Y?
← →
Джо © (2006-10-10 21:56) [5]> [4] EG (10.10.06 21:52)
> Если у объекта Y полем является объект X, можно ли, зная
> X, получить доступ ко всем остальням полям, методам, свойствам
> Y?
Для этого в объекте Х должно быть заведено поле или свойство, содержащее ссылку на объект Y.
← →
EG (2006-10-10 21:58) [6]Этого я и боялся.
Дело в том, что я использую THHHHObject для визуализации экземпляра класса Tclass1, поскольку сам он типа абстрактный, невизуальный.
Как быть, если соприкосновение с миром программы экземпляра Tclass1 идет через его поле THHHHObject.
К примеру: У THHHHObject возникает какое-либо событие, в случае которого должны измениться поля экземпляра Tclass1. Как-то обойти парадигму невозможности можно?
← →
EG (2006-10-10 22:01) [7]
> Для этого в объекте Х должно быть заведено поле или свойство,
> содержащее ссылку на объект Y.
Как? класс переписывать? THHHHObject - не я писал, а разработчики дельфи
← →
Джо © (2006-10-10 22:02) [8]> [6] EG (10.10.06 21:58)
> Этого я и боялся.
> Дело в том, что я использую THHHHObject для визуализации
> экземпляра класса Tclass1, поскольку сам он типа абстрактный,
> невизуальный.
>
> Как быть,если соприкосновение с миром программы
экземпляра
> Tclass1 идет через его поле THHHHObject.
>
> К примеру: У THHHHObject возникает какое-либо событие, в
> случае которого должны измениться поля экземпляра Tclass1.
> Как-то обойти парадигму невозможности можно?
Можно еще проще? Без неверного употребления незнакомых терминов?
← →
Kolan © (2006-10-10 22:03) [9]
> Дело в том, что я использую THHHHObject для визуализации
> экземпляра класса Tclass1, поскольку сам он типа абстрактный,
> невизуальный.
Архитектура не верная. Если THHHHObject(дурацкое название) визуализирует экзепрляр Tclass1, то он делжен знать о Tclass1, а Tclass1 о нем знать не должен.
Те в THHHHObject должен быть метод(вариантоа много, это 1 из них) тапа такого:
THHHHObject.VisualiseClass1(A: Tclass1);
← →
Leonid Troyanovsky © (2006-10-10 22:03) [10]
> EG (10.10.06 21:58) [6]
> К примеру: У THHHHObject возникает какое-либо событие, в
> случае которого должны измениться поля экземпляра Tclass1.
> Как-то обойти парадигму невозможности можно?
Пуркуа па?
В обработчике события изменяем поля Tclass1.
Вот, собс-но, и все.
--
Regards, LVT.
← →
Kolan © (2006-10-10 22:04) [11]
> класс переписывать? THHHHObject
Вообщето есть наследование и др механизмы...
← →
Zeqfreed © (2006-10-10 22:09) [12]Каким интересно THHHHObject, написанным разработчиками Delphi, ты визуализируешь свой класс.
← →
EG (2006-10-10 22:12) [13]
> Каким интересно THHHHObject, написанным разработчиками Delphi,
> ты визуализируешь свой класс.
Да любым. THHHHObject - для неконкретности взято.
← →
Kolan © (2006-10-10 22:13) [14]
>
> Да любым. THHHHObject - для неконкретности взято.
>
Так что не помогли мы тебе что-ли...
← →
EG (2006-10-10 22:15) [15]
> В обработчике события изменяем поля Tclass1.
Переписать хотя бы частично класс THHHHObject не могу.
> Архитектура не верная. Если THHHHObject(дурацкое название)
> визуализирует экзепрляр Tclass1, то он делжен знать о Tclass1,
> а Tclass1 о нем знать не должен.
Можно поподробнее как это сделать, если я не могу переписать THHHHObject?
Я новичок и с перекрытием методов, свойств и пр. мне не справиться...:(
← →
Leonid Troyanovsky © (2006-10-10 22:17) [16]
> Kolan © (10.10.06 22:13) [14]
> > Да любым. THHHHObject - для неконкретности взято.
> Так что не помогли мы тебе что-ли...
Сомнения здесь неуместны.
--
Regards, LVT.
← →
Джо © (2006-10-10 22:17) [17]> [13] EG (10.10.06 22:12)
>
> > Каким интересно THHHHObject, написанным разработчиками
> Delphi,
> > ты визуализируешь свой класс.
>
>
> Да любым. THHHHObject - для неконкретности взято.
Похоже, в данном случае, конкретность не помешает.
← →
Kolan © (2006-10-10 22:18) [18]
> Я новичок и с перекрытием методов, свойств и пр. мне не
> справиться...:(
Ну ....
Давай реальный(классы, что нужно...) пример может есть элементарное решение.
← →
Zeqfreed © (2006-10-10 22:19) [19]> [15] EG (10.10.06 22:15)
Может все-таки приоткроешь завесу тайны и признаешься что за секретный THHHHObject используешь? Иначе, тебе надо произвести HHHH над HHHH и ещё HHHH с inheritance.
← →
Ketmar © (2006-10-10 22:21) [20]ага. и будет полный HHHH до самого HHHH. и да здравствует великий HHHH!
%-)
← →
Kolan © (2006-10-10 22:28) [21]
> HHHH
Зто сокрашенное название классаTЗаборObject
на котором и надо визуальзироватьTClass1
:)
← →
EG (2006-10-10 22:30) [22]
> ага. и будет полный HHHH до самого HHHH. и да здравствует
> великий HHHH!
> %-)
С юморком. Это хорошо.
Окей! Выкладываю начисто, так как помочь мне уже некому кроме вас.
Дислокация: Delphi+GLScene.
Код:
type
TegActor = class (TObject)
IDname: string;
Model: TActor;
Weapons: array of TegWeapon;
ActiveWeapon: integer;
constructor Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id:string);
destructor Free;
procedure LoadWeapon(cadencer:TGLCadencer;modfn,texfn:string;sc:real);
procedure ChangeWeapon(number:integer);
procedure DoIt(action: string; Speed: integer);
procedure Stand(sender:Tobject);
end;
И:
constructor TegActor.Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id: string);
begin
Model:=TActor(cadencer.Scene.Objects.AddNewChild(TActor));
With Model do
begin
LoadFromFile(modfn);
Scale.Scale(sc);
Position.X:=x;
Position.Y:=y;
Position.Z:=z;
Material.Texture.Image.LoadFromFile(texfn);
Material.Texture.Enabled:=true;
Animations.LoadFromFile(animfn);
AnimationMode:=aamNone;
OnEndFrameReached:=Stand;
end;
IDname:=id;
end;
Этим я хотел расширить класс TActor.
Далее:
procedure TVForm.SceneViewerMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
pickedObject : TGLBaseSceneObject;
begin
pickedObject:=SceneViewer.Buffer.GetPickedObject(x, y);
if pickedObject<>nil then
// if(pickedObject.ClassNameIs("TActor"))then
VForm.Caption:= pickedObject.GetParentComponent.ClassName
else VForm.Caption:="";
if Shift<>[] then
Camera1.MoveAroundTarget(mdy-y, mdx-x);
mdx:=x; mdy:=y;
end;
В pickedObject возвращается имя объекта под курсором. Надо показать на экране (или изменить) поле IDName у экземпляра TegActor.
← →
EG (2006-10-10 22:32) [23]VForm.Caption:= pickedObject.GetParentComponent.ClassName - байда, не обращайте внимания. Но в этом месте и загвоздка.
← →
Kolan © (2006-10-10 22:36) [24]А нельзя ли сделать "Менеджер" который бы знал о
TegActor
, оpickedObject
иTVForm
. И управлял бы прорисовками по событию?
Или я не понял код...
← →
EG (2006-10-10 22:40) [25]Возвращается TActor, а мне надо получить объект, чьим полем он является...
← →
EG (2006-10-10 22:44) [26]ау, скажите хоть что-нить, а то у меня паника скоро начнется
← →
Джо © (2006-10-10 22:50) [27]Что-то, ИМХО, тут перемудрено, ну да ладно.
TMyActor = class (TActor)
private
FEgActor: TegActor;
public
property EgActor: TegActor read FEActor;
end;
...
constructor TegActor.Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id: string);
begin
Model:=TActor(cadencer.Scene.Objects.AddNewChild(TActor));
With Model do
begin
...
FEgActor := Self;
end;
IDname:=id;
end;
Идея понятна?
← →
Джо © (2006-10-10 22:52) [28]Кстати, почему бы не сделать TegActor наследником TActor"а?
← →
EG (2006-10-10 22:54) [29]
> Джо © (10.10.06 22:50) [27]
Практически нет.
По-моему так перемудрим еще больше.
← →
EG (2006-10-10 22:58) [30]
> Джо © (10.10.06 22:52) [28]
>
> Кстати, почему бы не сделать TegActor наследником TActor"а?
>
Не раз приходило в голову но... КАК? Начинает ругаться, что я перекрываю методы, или чего-то в этом духе....
Мне по идее к TActor"у надо добавить-то пару полей и методов...но...:(
Я считал, что мой вариант проще...иерархия по полям прозрачна ....только сверху вниз, а вот вверх - жопа...
← →
Джо © (2006-10-10 23:02) [31]> [30] EG (10.10.06 22:58)
> Не раз приходило в голову но... КАК?
Вооружившись учебником.
← →
EG (2006-10-10 23:05) [32]
> Джо © (10.10.06 23:02) [31]
>
> > [30] EG (10.10.06 22:58)
> > Не раз приходило в голову но... КАК?
>
> Вооружившись учебником.
это перевернет не только архитектуру программы, но и моего мировоззрения. но и на том спасибо.
← →
Amoeba © (2006-10-11 11:49) [33]
> это перевернет не только архитектуру программы, но и моего
> мировоззрения
Вот и хорошо. Твое мировоззрение следует поставить с головы на ноги.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c