Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

ООП: обмен методами   Найти похожие ветки 

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

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

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? естественно можно значения полей передавать в виде параметров функции но это не интересно!


 
Джо ©   (2005-08-17 22:15) [1]

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


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

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

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


 
x111 ©   (2005-08-17 22:23) [3]

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

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


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

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

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

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


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

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

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


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

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

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


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

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


 
lookin ©   (2005-08-17 22:57) [8]

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


 
Джо ©   (2005-08-17 23:10) [9]


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

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


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


>  [9] Джо ©


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

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


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

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

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

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

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


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

Defunct ©   (18.08.05 00:48) [11]

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

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

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

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


 
evvcom ©   (2005-08-18 09:11) [13]


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

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


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

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


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


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


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

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

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


 
Digitman ©   (2005-08-18 13:11) [16]


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


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

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

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

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


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


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

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

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


 
Leonid Troyanovsky ©   (2005-08-18 13:49) [17]


> Digitman ©   (18.08.05 13:11) [16]

>> мне вот советовали ассемблер поучить

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

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


Не слушай, Танечка, профанов с вашего факультета,
учи лучше с#, VB или основы ООП, на худой конец.

--
Regards, LVT.


 
Digitman ©   (2005-08-18 13:56) [18]


> Leonid Troyanovsky ©   (18.08.05 13:49) [17]


фундаментальные знания дает лишь знание происходящего в ЦП.

а в ЦП, как понимаешь, нет никаких "Васиков", "шарпов", "Паскалей", "СИ" и прочей дребедени.

НИКАКОЙ "шарп" (и прочая NET-ботва) не даст ФУНДАМЕНТАЛЬНЫХ знаний... если, конечно же, они нужны автору.


 
Гаврила ©   (2005-08-18 14:52) [19]


>  [14] Игорь Шевченко ©


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


С картинками не получится.
Я имел в виду вот что:
если бы компоненты из VCL (стандартные) занимались бы тем, что присваивали друг другу собственные обработчики типа OnClick, было бы  грустно.


 
Defunct ©   (2005-08-18 14:58) [20]

Гаврила ©   (18.08.05 14:52) [19]

Гм.. именно на этом все и построено.
Любой OnClick принадлежит не экземпляру TButton, а совсем другому классу, и было бы весьма печально, если бы при этом работа велась с полями TButton вместо определенных вами полей в TForm.


 
Игорь Шевченко ©   (2005-08-18 15:05) [21]

Гаврила ©   (18.08.05 14:52) [19]

Все равно не понимаю. Ты что именно имеешь в виду ?


 
Defunct ©   (2005-08-18 15:11) [22]

злобная танька   (18.08.05 13:03) [15]

Просто так не нужно делать.. вот ;>

Представим что в классе TC2, вдруг добавляется третье поле, и не где-нибудь а перед FA, FB:

TC2 = class
 FC : byte;
 FA : byte;
 FB : byte;

И все, процедура класса TC1 ищет поля по смещениям 0, 1 (как они задекларированы в TC1) и естественно работает уже не с FA/FB, а с FC/FA.
Как там в теории, "объект - это совокупность полей данных и методов для работы с полями". только методы класса и его наследников должны работать с полями этого класса, иначе - дурной тон, повышение вероятности возникновения ошибок.


 
Leonid Troyanovsky ©   (2005-08-18 15:30) [23]


> Digitman ©   (18.08.05 13:56) [18]

> фундаментальные знания дает лишь знание происходящего в
> ЦП.


Я имею(имел) фундаментальные знания по радиохимии и
прикладной математике, а на хлеб зарабатываю всякой дребеденью ;)

--
Regards, LVT.


 
Гаврила ©   (2005-08-18 16:45) [24]


>  [21] Игорь Шевченко ©


У меня ,видимо, сегодня проблемы с формулированием мыслей :-)
короче:
попробую сформулровать иначе
я считаю дурным тоном использование (то есть присвоение) событий внутри иерархии классов, все классы которой (иерархии) уже известны на момент разработки.
То есть события можно вводить для использования пользовательскими наследниками (про которые базовые классы знать не знают), но не для использования внутри иерархии базовых классов.


>  [20] Defunct ©

короче я не об этом. То есть получилось что я ушел в оффтопик. Я не про поле Data от TMethod, а про проектирование


 
Digitman ©   (2005-08-18 16:47) [25]


> Leonid Troyanovsky ©   (18.08.05 15:30) [23]


> имею(имел) фундаментальные знания по радиохимии и
> прикладной математике, а на хлеб зарабатываю всякой дребеденью


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

и что с того ?

ни-че-го.

у тебя фундамент - радиохимия и "прочая дребедень".
у меня - КПРЭА.

оба мы как бы имеем некое отношение к программингу на базе i80x86 и Win32.

НИ твоя "радиохимия" НИ моё КПРЭА к этому НЕ имеет никакого прямого отношения.


 
Игорь Шевченко ©   (2005-08-18 16:52) [26]

Гаврила ©   (18.08.05 16:45) [24]


> я считаю дурным тоном использование (то есть присвоение)
> событий внутри иерархии классов, все классы которой (иерархии)
> уже известны на момент разработки.
> То есть события можно вводить для использования пользовательскими
> наследниками (про которые базовые классы знать не знают),
> но не для использования внутри иерархии базовых классов.


Ну это когда как. Если новое событие вызывает пользовательское, то почему бы и нет ?


 
jack128 ©   (2005-08-18 17:02) [27]

Игорь Шевченко ©   (18.08.05 16:52) [26]
Ну это когда как. Если новое событие вызывает пользовательское, то почему бы и нет ?

потому что пользователь в любой момент может захотеть об"nil"ить событие.  И уж врядли он будет предпологать, что в качестве обработчика стоит не его метод, а какой то другой, абсолютно левый...


 
Гаврила ©   (2005-08-18 17:12) [28]


>  [26] Игорь Шевченко ©


не запрещается, но потом трудно понять, откуда что берется -
снижается читабельность кода


 
Игорь Шевченко ©   (2005-08-18 17:59) [29]

jack128 ©   (18.08.05 17:02) [27]

Мы наверное о разных классах говорим. И о разных методах подмены событий. Если класс подменяет событие в run-time, сохраняя определенное в design-time пользователем событие, то я не вижу в этом ничего плохого и некорректного.


 
x111 ©   (2005-08-18 22:52) [30]

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

ASM знать не помешает (даже очень), мне хватает 8086,
чтобы разобраться в некоторых вещах.
Тогда сразу понятно почему нельзя делать TMethod().Data - это будет работать (может и не всегда, реализацию не смотрел), но так
нарушается весь смысл ООП. Это скорее всего запись для
"внутреннего использования" и скорее всего это и есть пресловутый
Self.

Defunct ©   (18.08.05 00:48) [11]

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

Согласен, но я же сказал - это грубо (читай доступно)


 
GuAV ©   (2005-08-19 01:00) [31]

Игорь Шевченко ©   (18.08.05 17:59) [29]


> Если класс подменяет событие в run-time, сохраняя
> определенное в design-time пользователем событие, то я
> не вижу в этом ничего плохого и некорректного.

А разве пользователь не может назначить другой обработчик в Run-time ?


 
GuAV ©   (2005-08-19 01:05) [32]

...да или хотя бы второй такой же "вумный" класс.


 
Германн ©   (2005-08-19 01:36) [33]

2 Digitman ©   (18.08.05 16:47) [25]
Добавление к Leonid Troyanovsky ©   (18.08.05 15:30) [23]

Добавь ещё мою "квантовую радиофизику" и, заодно "физику твердого тела". У меня диплом по второй со спецификацией первой.

Но в данном форуме все эти "дипломы" и "спецификации", никому не нужны!


 
Defunct ©   (2005-08-19 01:37) [34]

> GuAV
> да или хотя бы второй такой же "вумный" класс.

Здесь нет предмета для спора. Так на пустом месте топик зашел в какой-то глобальный оффтопищще.

TMyNonVisualControl = class( TSomeClass )
private
 ..
 procedure HandleAlertClick(sender : TObject);
public
 procedure Alert;dynamic;
 ..
end;

procedure TMyNonVisualControl.Alert;
begin
 with TButton.Create() do
 begin
    OnClick := HandleAlertClick;
    ...
 end;
end;

procedure TMyNonVisualControl.HandleAlertClick(Sender : TObject);
begin
 MoveToGarbage( Sender );
 ...
end;


Класс переопределяет обработчик для TButton"a? - переопределяет. Является вумным? а черт его знает. Пользователь как-то пострадает? нет. Сможет пользователь в любое время об"nil"ить событие (как говорит jack)? нет.


 
Leonid Troyanovsky ©   (2005-08-19 09:10) [35]


> Германн ©   (19.08.05 01:36) [33]

> Но в данном форуме все эти "дипломы" и "спецификации", никому
> не нужны!


А девочкам на данном форуме не нужны понуждения к изучению asm.

--
Regards, LVT.


 
jack128 ©   (2005-08-19 12:33) [36]

Defunct ©   (19.08.05 1:37) [34]
public
procedure Alert;dynamic;


ты не понял, речь идет о подменесобытий у внешнего комппонента. Как, например,  TApplicationEvents действует..



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.011 c
14-1124344432
Kot Andrei
2005-08-18 09:53
2005.09.11
Просто анекдот


1-1124747605
kimona
2005-08-23 01:53
2005.09.11
RichEdit and background Image


6-1116836925
Uninstall
2005-05-23 12:28
2005.09.11
Переход с Indy 9 на Indy 10.


14-1124285409
Piter
2005-08-17 17:30
2005.09.11
Что выбрать из недорогого, помогите советом


1-1124177403
Arkady
2005-08-16 11:30
2005.09.11
TOpenDialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский