![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ООП: обмен методами [D7, WinXP]
злобная танька © (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 будет записывать себя. Вот так исхитрись ;)