![]() |
| ||
|
|
Новости |
Поиск |
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? естественно можно значения полей передавать в виде параметров функции но это не интересно!
jack128 (2005-08-19 12:33:00) [1]Defunct © (19.08.05 1:37) [34]
public
procedure Alert;dynamic;
ты не понял, речь идет о подменесобытий у внешнего комппонента. Как, например, TApplicationEvents действует..
Leonid Troyanovsky (2005-08-19 09:10:00) [2]
> Германн © (19.08.05 01:36) [33]
> Но в данном форуме все эти "дипломы" и "спецификации", никому
> не нужны!
А девочкам на данном форуме не нужны понуждения к изучению asm.
--
Regards, LVT.
Defunct (2005-08-19 01:37:00) [3]> 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)? нет.
Германн (2005-08-19 01:36:00) [4]2 Digitman © (18.08.05 16:47) [25]
Добавление к Leonid Troyanovsky © (18.08.05 15:30) [23]
Добавь ещё мою "квантовую радиофизику" и, заодно "физику твердого тела". У меня диплом по второй со спецификацией первой.
Но в данном форуме все эти "дипломы" и "спецификации", никому не нужны!
GuAV (2005-08-19 01:05:00) [5]...да или хотя бы второй такой же "вумный" класс.
GuAV (2005-08-19 01:00:00) [6]Игорь Шевченко © (18.08.05 17:59) [29]
> Если класс подменяет событие в run-time, сохраняя
> определенное в design-time пользователем событие, то я
> не вижу в этом ничего плохого и некорректного.
А разве пользователь не может назначить другой обработчик в Run-time ?
x111 (2005-08-18 22:52:00) [7]злобная танька (17.08.05 22:31) [5]
ASM знать не помешает (даже очень), мне хватает 8086,
чтобы разобраться в некоторых вещах.
Тогда сразу понятно почему нельзя делать TMethod().Data - это будет работать (может и не всегда, реализацию не смотрел), но так
нарушается весь смысл ООП. Это скорее всего запись для
"внутреннего использования" и скорее всего это и есть пресловутый
Self.
Defunct © (18.08.05 00:48) [11]
>если уж на то пошло.
>У классна нет полей. есть только фантазия смещений.
Согласен, но я же сказал - это грубо (читай доступно)
Игорь Шевченко (2005-08-18 17:59:00) [8]jack128 © (18.08.05 17:02) [27]
Мы наверное о разных классах говорим. И о разных методах подмены событий. Если класс подменяет событие в run-time, сохраняя определенное в design-time пользователем событие, то я не вижу в этом ничего плохого и некорректного.
Гаврила (2005-08-18 17:12:00) [9]
> [26] Игорь Шевченко ©
не запрещается, но потом трудно понять, откуда что берется -
снижается читабельность кода
jack128 (2005-08-18 17:02:00) [10]Игорь Шевченко © (18.08.05 16:52) [26]
Ну это когда как. Если новое событие вызывает пользовательское, то почему бы и нет ?
потому что пользователь в любой момент может захотеть об'nil'ить событие. И уж врядли он будет предпологать, что в качестве обработчика стоит не его метод, а какой то другой, абсолютно левый...
Игорь Шевченко (2005-08-18 16:52:00) [11]Гаврила © (18.08.05 16:45) [24]
> я считаю дурным тоном использование (то есть присвоение)
> событий внутри иерархии классов, все классы которой (иерархии)
> уже известны на момент разработки.
> То есть события можно вводить для использования пользовательскими
> наследниками (про которые базовые классы знать не знают),
> но не для использования внутри иерархии базовых классов.
Ну это когда как. Если новое событие вызывает пользовательское, то почему бы и нет ?
Digitman (2005-08-18 16:47:00) [12]
> Leonid Troyanovsky © (18.08.05 15:30) [23]
> имею(имел) фундаментальные знания по радиохимии и
> прикладной математике, а на хлеб зарабатываю всякой дребеденью
равно как и я, который имею(имел, меня имели - нужное подчеркнуть) как пресловутый "фундамент" отнюдь не сабж.
и что с того ?
ни-че-го.
у тебя фундамент - радиохимия и "прочая дребедень".
у меня - КПРЭА.
оба мы как бы имеем некое отношение к программингу на базе i80x86 и Win32.
НИ твоя "радиохимия" НИ моё КПРЭА к этому НЕ имеет никакого прямого отношения.
Гаврила (2005-08-18 16:45:00) [13]
> [21] Игорь Шевченко ©
У меня ,видимо, сегодня проблемы с формулированием мыслей :-)
короче:
попробую сформулровать иначе
я считаю дурным тоном использование (то есть присвоение) событий внутри иерархии классов, все классы которой (иерархии) уже известны на момент разработки.
То есть события можно вводить для использования пользовательскими наследниками (про которые базовые классы знать не знают), но не для использования внутри иерархии базовых классов.
> [20] Defunct ©
короче я не об этом. То есть получилось что я ушел в оффтопик. Я не про поле Data от TMethod, а про проектирование
Leonid Troyanovsky (2005-08-18 15:30:00) [14]
> Digitman © (18.08.05 13:56) [18]
> фундаментальные знания дает лишь знание происходящего в
> ЦП.
Я имею(имел) фундаментальные знания по радиохимии и
прикладной математике, а на хлеб зарабатываю всякой дребеденью ;)
--
Regards, LVT.
Defunct (2005-08-18 15:11:00) [15]злобная танька (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.
Как там в теории, "объект - это совокупность полей данных и методов для работы с полями". только методы класса и его наследников должны работать с полями этого класса, иначе - дурной тон, повышение вероятности возникновения ошибок.
Игорь Шевченко (2005-08-18 15:05:00) [16]Гаврила © (18.08.05 14:52) [19]
Все равно не понимаю. Ты что именно имеешь в виду ?
Defunct (2005-08-18 14:58:00) [17]Гаврила © (18.08.05 14:52) [19]
Гм.. именно на этом все и построено.
Любой OnClick принадлежит не экземпляру TButton, а совсем другому классу, и было бы весьма печально, если бы при этом работа велась с полями TButton вместо определенных вами полей в TForm.
Гаврила (2005-08-18 14:52:00) [18]
> [14] Игорь Шевченко ©
> Переведи. Можно с картинками :)
С картинками не получится.
Я имел в виду вот что:
если бы компоненты из VCL (стандартные) занимались бы тем, что присваивали друг другу собственные обработчики типа OnClick, было бы грустно.
Digitman (2005-08-18 13:56:00) [19]
> Leonid Troyanovsky © (18.08.05 13:49) [17]
фундаментальные знания дает лишь знание происходящего в ЦП.
а в ЦП, как понимаешь, нет никаких "Васиков", "шарпов", "Паскалей", "СИ" и прочей дребедени.
НИКАКОЙ "шарп" (и прочая NET-ботва) не даст ФУНДАМЕНТАЛЬНЫХ знаний... если, конечно же, они нужныавтору.
Leonid Troyanovsky (2005-08-18 13:49:00) [20]
> Digitman © (18.08.05 13:11) [16]
>> мне вот советовали ассемблер поучить
> и правильно посоветовали.
> и не просто ассемблер, а желательно ассемблер для конкретной
> системы маш.инструкций конкретного процессора (или семейства
> совместимых процессоров)
Не слушай, Танечка, профанов с вашего факультета,
учи лучше с#, VB или основы ООП, на худой конец.
--
Regards, LVT.