Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ООП: обмен методами [D7, WinXP]


Страницы:   1 2

злобная танька ©   (2005-08-17 22:04:00) 

привет! у меня теоретический вопрос.. когда один объект использует метод другого объекта (это кажется называется делигирование).. при обращении к полям (если у них эти поля у обоих есть) этот метод берет значения из полей объекта из которого он (метод) был взят. то есть вот:

type
 TFunction = function: integer of object;

 Tc1 = class
   FA, FB: Byte;
   function AiB: integer;
 end;

 Tc2 = class
   FA, FB: Byte;
   Func: TFunction;
 end;

{$R *.dfm}

function Tc1.AiB: integer;
begin
 Result := FA + FB;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a: Tc1;
 b: Tc2;
begin
 a := Tc1.Create;
 b := Tc2.Create;

 a.FA := 1; a.FB := 2;
 b.FA := 3; b.FB := 4;

 b.Func := a.AiB;
 ShowMessage(IntToStr(b.Func));  //выдаёт 3!

 a.Free;
 b.Free;
end;


так вот у меня вопрос! можно ли как-нибудь исхитриться чтобы этот метод брал поля класса Tc2? естественно можно значения полей передавать в виде параметров функции но это не интересно!


Digitman   (2005-08-18 13:11:00) [21]


> злобная танька   (17.08.05 22:31) [5]
> мне вот советовали ассемблер поучить


и правильно посоветовали.

только не "поучить", а выучить.

и не просто ассемблер, а желательно ассемблер для конкретнойсистемы маш.инструкций конкретного процессора (или семейства совместимых процессоров)

в дан.случае, очевидно, - i80x86


> хотя это профаны были


ну почему сразу "профаны" ?

ЭТИ знания будут ВСЕГДА востребованы !
и тобой и твоим потенц.заказчиком ..
пусть даже неявно востребованы ..

понимание того ЧТО и КАК происходит в недрах "черного ящика" под названием Центральный Процессор еще никому и никогда не помешало с момента рождения этого "ящика"


злобная танька   (2005-08-18 13:03:00) [22]

> Defunct ©   (18.08.05 00:53) [12]

это изначально был теоретический вопроса не гонево. я нигде не говорила что мне надотак сделать. просто стало интересно. вот.


Игорь Шевченко   (2005-08-18 12:34:00) [23]

Гаврила ©   (17.08.05 23:16) [10]


> мое имхо - при наращивании иерархии классов "в библиотеке"
> (то есть ниже уровня прилодения) использовать для взаимоджействия
> между классами события (любые адреса вызовов) - дурной тон.
> потому что в таком коде потом нифига не поймешь


Переведи. Можно с картинками :)


evvcom   (2005-08-18 09:11:00) [24]


> Поглядев на этот метод через пару недель даже не вспомнишь
> что, зачем и как он делает.

"Что и зачем" действительно лучше комментарием снабдить. А вот "как" - это понятно. Если эту возможность знать и помнить, то ничего сложного в этом для понимания нет. Опять же если "ассемблер поучить", ведь "там говорят практически всё видно очень хорошо что как работает"(с) злобная танька. Очень правильно говорят, даже если "это профаны были с нашего факультета" (с) злобная танька.


Defunct   (2005-08-18 00:53:00) [25]

Defunct ©   (18.08.05 00:48) [11]

> это не делигирование, это гонево.

имелось в виду не о конструкции присваивания, а о желании:

> злобная танька  
> как-нибудь исхитриться чтобы этот метод брал поля класса Tc2?

(забыл вставить эту цитату).


Defunct   (2005-08-18 00:48:00) [26]

x111 ©   (17.08.05 22:23) [3]
> но тоже чисто теоретически:
> Func: TFunction; - это адрес,
> ...

если уж на то пошло.
У классна нет полей. есть только фантазия смещений.

> злобная танька  
>  b.Func := a.AiB;

это не делигирование, это гонево.
просто баг, так писать нельзя.


Гаврила   (2005-08-17 23:16:00) [27]


>  [9] Джо ©


Такие вещи обязательно комментируются :-)

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


Джо   (2005-08-17 23:10:00) [28]


>  [7] злобная танька   (17.08.05 22:53)
> ну вот а говорили что нельзя :)
> всё оч. просто оказывается!

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


lookin   (2005-08-17 22:57:00) [29]

Не в тему- иногда завидую людям, умеющим и смакующим такие конструкции, как TMethod(b.Func).Data := b; Для меня это настолько из ряда вон, что просто никогда бы не подумал о такой возможности...


злобная танька   (2005-08-17 22:53:00) [30]

ну вот а говорили что нельзя :)
всё оч. просто оказывается!


Турист   (2005-08-17 22:31:00) [31]

>злобная танька   (17.08.05 22:04)  

b.Func := a.AiB;
TMethod(b.Func).Data := b;


злобная танька   (2005-08-17 22:31:00) [32]

> P.S. Все это теоритически и очень "грубо"
ну хоть так :)
спасибо x111!

ps мне вот советовали ассемблер поучить там говорят практически всё видно очень хорошо что как работает. хотя это профаны были с нашего факультета не знаю прям верить / не верить.


Юрий Зотов   (2005-08-17 22:28:00) [33]

> злобная танька   (17.08.05 22:22) [2]

> как метод запоминает дорогу к полям своего объекта?

Метод объекта при своем вызове получает неявный параметр Self - это и есть указатель на экземпляр объекта. Поля берутся оттуда.


x111   (2005-08-17 22:23:00) [34]

Нет.
но тоже чисто теоретически:
Func: TFunction; - это адрес,
а после компиляции получается что-то типа: call адрес
т.е. вызывается процедура по этому адресу, а она метод класса
Тс1 соответственно и поля ЭТОГО класса будут использоваться.

P.S. Все это теоритически и очень "грубо"


злобная танька   (2005-08-17 22:22:00) [35]

> Джо ©   (17.08.05 22:15) [1]
вау... мощщ!

а всё таки как метод запоминает дорогу к полям своего объекта? прямо как кошки про которых в комсомолке писали которые из тайги домой приходили. гм я просто не вполне представляю как там устроено всё. для меня некоторые вещи наподобие этого делигирования совсем неочевидны и приходится гм методом проб и ошибок..


Джо   (2005-08-17 22:15:00) [36]

Заведи в Tc1 приватное поле Parent, например, в которое TC2 будет записывать себя. Вот так исхитрись ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо