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

Вниз

Что вы обычно используете abstract или dynamic методы?   Найти похожие ветки 

 
Ученик чародея.   (2006-11-01 16:21) [0]

Почему?


 
Kerk ©   (2006-11-01 16:22) [1]

Это разные вещи


 
Ученик чародея.   (2006-11-01 16:22) [2]

тоесть virtual или dynamic


 
Игорь Шевченко ©   (2006-11-01 16:23) [3]

static


 
Ученик чародея.   (2006-11-01 16:28) [4]


> Игорь Шевченко ©   (01.11.06 16:23) [3]
>
> static


Можно если писать в стиле "Pascal с классами", но как же при этом полиморфизм.

Ну тоесть классы с virtual методами тратят больше памяти, но происходит быстрее вызов, так как табличный. Насколько обычно критичен этот перерасход памяти.


 
Lamer@fools.ua ©   (2006-11-01 16:29) [5]

>virtual или dynamic
virtual.

>Почему?
Потому что в C# нету dynamic методов :-P


 
Skier ©   (2006-11-01 16:29) [6]


> Насколько обычно критичен этот перерасход памяти.

не критичен.


 
Marser ©   (2006-11-01 16:31) [7]

Варианты:
1. Софт пьян.
2. У Софта проблемы с клавиатурой.
3. Это не Софт.

Склоняюсь в сторону последнего. При всех своих недостатках, он пишет грамотно и достаточно чётко.


 
ancara ©   (2006-11-01 16:31) [8]

Дык, в хелпе ж написано:
Virtual and dynamic methods are semantically equivalent. They differ only in the implementation of method-call dispatching at runtime. Virtual methods optimize for speed, while dynamic methods optimize for code size.

 Лично я размером кода не заморачиваюсь, поэтому пишу virtual, хотя и за приростом в скорости не гонюсь. Если руки кривые, так никакие virtual не помогут, так я рассуждаю :)))


 
Игорь Шевченко ©   (2006-11-01 16:34) [9]


> Можно если писать в стиле "Pascal с классами", но как же
> при этом полиморфизм.


А пофиг полиморфизм. Сам по себе полиморфизм не является целью.


 
Anatoly Podgoretsky ©   (2006-11-01 16:39) [10]

> Ученик чародея.  (01.11.2006 16:22:02)  [2]

А это разные вещи, и это нормально объяснено в справке.


 
Ученик чародея ©   (2006-11-01 17:19) [11]


> Anatoly Podgoretsky ©   (01.11.06 16:39) [10]
>
> > Ученик чародея.  (01.11.2006 16:22:02)  [2]
>
> А это разные вещи, и это нормально объяснено в справке.


Да я знаю, что это функционально разные  понятия, но с точки зрения "интерфейса" идентичны. Мне было интересно зачем введено dynamic когда есть virtual, неужели на таблицу адресов виртуальных методов класса уходит так много памяти. Или это было сделано потому что "так чиста круто"?

Всегда использовал virtual, решил что, возможно, в некоторых случаях, использование dynamic более выгодно, чем использование virtual, но так и не смог найти случая где.


 
Игорь Шевченко ©   (2006-11-01 17:27) [12]

Ученик чародея ©   (01.11.06 17:19) [11]

таблица dynamic-методы не наследуется потомками, в отличие от таблицы виртуальных методов.


 
Eraser ©   (2006-11-01 17:30) [13]

> [11] Ученик чародея ©   (01.11.06 17:19)


> но так и не смог найти случая где.

Virtual Versus Dynamic

In Delphi for .NET, virtual and dynamic methods are identical. In Delphi for Win32, virtual and dynamic methods are semantically equivalent. However, they differ in the implementation of method-call dispatching at runtime: virtual methods optimize for speed, while dynamic methods optimize for code size.

In general, virtual methods are the most efficient way to implement polymorphic behavior. Dynamic methods are useful when a base class declares many overridable methods which are inherited by many descendant classes in an application, but only occasionally overridden.
Note:
Only use dynamic methods if there is a clear, observable benefit. Generally, use virtual methods.

© Справка по Делфи.


 
@!!ex ©   (2006-11-01 17:43) [14]

Virtual.
ООП изучан на С++ поэтому не знаю, что такое dynamic методы... :\
Наверно много потерял.


 
Ученик чародея.   (2006-11-01 18:03) [15]


> Eraser ©   (01.11.06 17:30) [13]

Вот как раз эту "observable benefit", использования dynamic в реальных задачах так и не сумел найти :)


 
Игорь Шевченко ©   (2006-11-01 18:06) [16]

Ученик чародея.   (01.11.06 18:03) [15]


> Вот как раз эту "observable benefit", использования dynamic
> в реальных задачах так и не сумел найти


Обработка оконных сообщений построена на динамических методах. Вполне себе реальная задача.


 
StriderMan ©   (2006-11-01 18:10) [17]

Кстати, раз уж разговор зашел...

объясните, мастера, в чем будет отличаться поведение объектов в двух следующих случаях?

1)

type
 TMyClass = class
    procedure Proc;
 end;

 TMyClass2 = class(TMyClass)
    procedure Proc;
 end;

...

procedure TMyClass2.Proc;
begin
//  Do something
 inherited
end;


2)

type
 TMyClass = class
    procedure Proc; virtual;
 end;

 TMyClass2 = class(TMyClass)
    procedure Proc; override;
 end;

...

procedure TMyClass2.Proc;
begin
//  Do something
 inherited
end;


 
Ученик чародея ©   (2006-11-01 18:14) [18]


> StriderMan ©   (01.11.06 18:10) [17]
>
> Кстати, раз уж разговор зашел...
>
> объясните, мастера, в чем будет отличаться поведение объектов
> в двух следующих случаях?


В данном коде ничем? И там и там должен вызватся inherited Proc?


 
StriderMan ©   (2006-11-01 18:20) [19]


> Ученик чародея ©   (01.11.06 18:14) [18]
> И там и там должен вызватся inherited
> Proc?

а даже если и не будет вызываться inherited, то в чем разница поведения?


 
Eraser ©   (2006-11-01 18:26) [20]

> [17] StriderMan ©   (01.11.06 18:10)

тем что в первом случае метод  TMyClass.Proc вызван не будет, а inherited будет проигнорирован, а во втором случае, при вызове TMyClass2.Proc будет вызван Proc класса TMyClass.


 
Юрий Зотов ©   (2006-11-01 18:29) [21]

> Ученик чародея ©   (01.11.06 17:19) [11]

> возможно, в некоторых случаях, использование dynamic более выгодно,
> чем использование virtual, но так и не смог найти случая где.

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


 
Eraser ©   (2006-11-01 18:29) [22]

> [20] Eraser ©   (01.11.06 18:26)

ошибся, с чем то что то перепутал (


 
Юрий Зотов ©   (2006-11-01 18:35) [23]

> StriderMan ©   (01.11.06 18:10) [17]

Во всех Proc поставьте ShowMessage (или брейкпойнты), а потом запустите эту программку для обоих вариантов:

var
 C: TMyClass; // Обратите внимание на класс
begin
 C := TMyClass2.Create; // Обратите внимание на класс
 try  
   C.Proc;
 finally
   C.Free
 end
end;
 
Сразу все и поймете...
:о)


 
Percent   (2006-11-01 18:37) [24]

а даже если и не будет вызываться inherited, то в чем разница поведения?

Разница будет в таком случае:

type
TMyClass = class
   procedure Proc;
   procedure CallerProc;
end;

 procedure TMyClass.CallerProc;
 begin
   {..}
   Proc;
   {...}
 end;


 
StriderMan ©   (2006-11-01 18:52) [25]


> Eraser ©   (01.11.06 18:26) [20]
>  а inherited будет проигнорирован

сомневаюсь, скорее ошибся, с чем то что то перепутал


> Юрий Зотов ©   (01.11.06 18:35) [23]

это как раз понятно. Виртуальный метод вызовется из того, к какому типу класс реально принадлежит


> Percent   (01.11.06 18:37) [24]

хороший пример.
вызовется Proc в зависимости от того, объект какого класса создадим


 
Суслик ©   (2006-11-01 20:32) [26]

всегда пишу virtual, т.к. не задумывался (повода не было) о том, что мне нужно что-то оптимизировать, и поэтому использовать dynamic.


 
vuk ©   (2006-11-02 01:03) [27]

to Суслик ©   (01.11.06 20:32) [26]:
>всегда пишу virtual
А оконные сообщения обрабатываешь(в смысле методы с директивой message)? Это тоже dynamic, хотя и синтаксис другой.


 
guav ©   (2006-11-02 01:18) [28]

> [27] vuk ©   (02.11.06 01:03)

Кстати...
Интересует вопрос, как RTL не путает dynamic и message методы ?


 
Ketmar ©   (2006-11-02 01:43) [29]

>[28] guav(c) 2-Nov-2006, 01:18
>Интересует вопрос, как RTL не путает dynamic и message
>методы ?
никак не путает. почитай генофонд. %-)


 
vuk ©   (2006-11-02 03:00) [30]

to guav ©   (02.11.06 01:18) [28]:
>Интересует вопрос, как RTL не путает dynamic и message методы ?
У каждого динамического метода свой, так называемый, индекс. У message он совпадает с кодом оконного сообщения в объявлении, у dynamic генерится компилятором автоматически.


 
Суслик ©   (2006-11-02 08:37) [31]


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

вопрос был про том, кто *явно* какой директивой пользуется - я ответил, что явно пользуюсь только virtual.


 
guav ©   (2006-11-02 13:04) [32]

> [29] Ketmar ©   (02.11.06 01:43)
> никак не путает. почитай генофонд. %-)

Укажи конкретную строку.


> [30] vuk ©   (02.11.06 03:00)
> У message он совпадает с кодом оконного сообщения в объявлении,
> у dynamic генерится компилятором автоматически.

Вот в том и вопрос, как он генерируется, что вызовы динамических методов не вызывают обработку сообщений и наоборот.


 
Суслик ©   (2006-11-02 13:25) [33]


> Вот в том и вопрос, как он генерируется, что вызовы динамических
> методов не вызывают обработку сообщений и наоборот.

причем тут обработка сообщений?
есть метод TObject.Dispatch, который собственно и вызывает нужный обработчик сообщения, если не найдет, то вызовет TObject.DefaultHandler.


 
Сатир   (2006-11-02 13:29) [34]

Согласно Марко Кэнту, виртуальные методы используются, если они будут перекрываться во многих наследниках, а динамические, если в одном.


 
Сатир   (2006-11-02 13:49) [35]

Таблицы виртуальных методов дают возможность быстрого исполнения вызовов. Их основным недостатком является то, что они требуют отдельной ячейки памяти для каждого виртуального метода каждого дочернего класса, даже если метод не был перекрыт ни в одном из этих классов. Иногда это приводит к эффекту копирования  адресов таблицы виртуальных методов по всей иерархии классов(даже для методов, которые не переопределялись). Это может потребовать большего количества памяти только для того, чтобы сохранить один и тот же адрес метода множество раз.
   Вызовы динамических методов производятся при помощи уникального номера, определяющего метод. Поиск соответствующей функции обычно медленней, чем простой одношаговый поиск в таблице виртуальных методов. Преимущество динамического метода в том, что информация о нём копируется в дочерний класс только в случае перекрытия. Для больших или глубоких иерархий классов использование динамических методов вместо

виртуальных может привести к значительной экономии памяти при минимальной потери в скорости.
Вот некоторые правила, согласно которым можно делать выбор между виртуальными и динамическими методами:
-если метод скорее всего будет перекрыт почти всеми потомками, его следует делать виртуальным;
-если метод будет перекрываться не очень часто, но все же требует позднего связывания для большей гибкости, сделайте его динамическим, особенно если у класса прогнозируется большое количество потомков;
- если метод может вызываться очень часто, много раз в секунду, сделайте его виртуальным.
(с)Марко Кэнту. Delphi 5 для профессионалов. с.94


 
Игорь Шевченко ©   (2006-11-02 14:23) [36]

guav ©   (02.11.06 13:04) [32]


> Вот в том и вопрос, как он генерируется, что вызовы динамических
> методов не вызывают обработку сообщений и наоборот.


У методов, объявленных с директивой dynamic, индекс начинается с FFFF и уменьшается с каждым новым методом. У сообщений индекс совпадает с номером сообщения. Чтобы они пересеклись, нужно приложить массу усилий.


 
guav ©   (2006-11-02 14:33) [37]

> [36] Игорь Шевченко ©   (02.11.06 14:23)

Понятно, спасибо.

дипазаон от FFFF и меньше - это RegisterWindowMessage сообщения, вот смеху-то будет, если эта функция перестанет возвращать значения подряд (от C000 и больше) :-)


 
Суслик ©   (2006-11-02 15:07) [38]


>  [37] guav ©   (02.11.06 14:33)

а извини, старик - я понял о чем ты спрашивал.
раньше неверно понял.


 
Игорь Шевченко ©   (2006-11-02 15:55) [39]

guav ©   (02.11.06 14:33) [37]


> дипазаон от FFFF и меньше - это RegisterWindowMessage сообщения,
>  вот смеху-то будет, если эта функция перестанет возвращать
> значения подряд от C000 и больше


Как только в Delphi появятся иерархии классов с совокупным числом динамических методов, превышающим 16,000, можешь смело бросать в меня камень. Как только в MS наплюют на обратную совместимость, можешь смело переходить на линукс, выбросив Delphi далеко и надолго и забыв  динамические методы, как кошмарный сон.


 
DiamondShark ©   (2006-11-02 16:25) [40]


> дипазаон от FFFF и меньше - это RegisterWindowMessage сообщения,
>  вот смеху-то будет, если эта функция перестанет возвращать
> значения подряд (от C000 и больше) :-)

L, как говорится, MD.

компилятор не генерирует method id < C000, а сообщения с message id >= C000 не пропустит TObject.Dispatch. R, как говорится, TFS.


 
guav ©   (2006-11-02 16:32) [41]

> [39] Игорь Шевченко ©   (02.11.06 15:55)
> Как только в Delphi появятся иерархии классов с совокупным
> числом динамических методов, превышающим 16,000

:-)
"Hey! I hate these Microsoft guys! What a rotten compiler! It only accepts 16,384 local variables in a function!"


> [40] DiamondShark ©   (02.11.06 16:25)
> L, как говорится, MD.
>
> компилятор не генерирует method id < C000, а сообщения с
> message id >= C000 не пропустит TObject.Dispatch. R, как
> говорится, TFS.

Спасибо, теперь всё стало правильно.



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

Форум: "Прочее";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.063 c
1-1160312498
Sanya_BBB
2006-10-08 17:01
2006.11.19
Передача фокуса и курсора при нажатии на Tab


15-1162220438
Чародей
2006-10-30 18:00
2006.11.19
Форматы файлов


1-1159865750
Sham
2006-10-03 12:55
2006.11.19
Проблема с типами данных


4-1150256660
xex32
2006-06-14 07:44
2006.11.19
Как принять штрих код со сканера в TEdit


15-1161927869
StriderMan
2006-10-27 09:44
2006.11.19
Тестирование





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский