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

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

ООП


Страницы:   1 2

МЯУ ©   (2004-09-10 22:59:00) 

У меня куча наследников одного класса, в котором описано большое количество абстрактных методов. Все методы в implementation описывать не охота (где-то 2/3 из них будут состоять из begin...end). Можно ли как нибудь перед вызовом метода проверить, overriden ли он у потомка?


Rem   (2004-09-13 15:56:00) [21]

LMD


Суслик   (2004-09-13 15:54:00) [22]


>  [16] МЯУ   (13.09.04 15:53)


> или пустотелые методы сделать лучше?

я уже сказал, что в данном случае с учетом текущей реализации это лучше - меньше переделывать.
Сравни мой тест - разница в несколько порядков :)))


Суслик   (2004-09-13 15:53:00) [23]


> [15] Rem   (13.09.04 15:50)

ты это мне?
Если да, то с какой стати?
Если нет, то почему [12] упомянул


МЯУ   (2004-09-13 15:53:00) [24]

суслик ©   (13.09.04 15:37) [12]

вызов try/except будет работать быстрее, чем 10 проверок типа "if (TMyObject is TMySofa) then"? блин, никогда бы не подумал. Ну да ладно, наверно всё же придётся переделать :)
или пустотелые методы сделать лучше?

а в принципе скорость не так уж и важна, я делаю пошаговую стратегию, там вообще все стоят на месте большую часть времени.


Rem   (2004-09-13 15:50:00) [25]

[12] Что такое грабли и как ими пользоваться.

Конструкция try-except-finally-endпридумана не для выпрямления кривых рук программиста, а обработки исключительных ситуаций, которые происходят не по вине программиста.

Вызывать абстрактный метод и защищать вызов конструкцией try-except-end- проявление высшего дилетантства.

Если хотите кучу граблей - определите Application.OnException. И будет вам "счасте"...


Суслик   (2004-09-13 15:48:00) [26]


>  [13] Ega23 ©   (13.09.04 15:41)

в смысле это лучше чем try except.

лучше по скорости, сравни

type
  tcl = class
     procedure aa; virtual; abstract;
  end;

  tcl1 = class
     procedure aa; virtual;
  end;

procedure tcl1.aa;
begin
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  c: tcl;
  c1: tcl1;
  kI: integer;
  kc, kca, kf: TLargeInteger;
begin
  queryperformancefrequency(kf);

  c := tcl.create();
  queryperformancecounter(kc);
  for kI := 1 to 10000 do
  begin
     try
        c.aa;
     except
     end;
  end;
  queryperformancecounter(kca);
  showmessage(format('%.8f', [(kca - kc) / kf]));

  c1 := tcl1.create();
  queryperformancecounter(kc);
  for kI := 1 to 10000 do
  begin
     c1.aa;
  end;
  queryperformancecounter(kca);
  showmessage(format('%.8f', [(kca - kc) / kf]));
end;


Ega23   (2004-09-13 15:41:00) [27]

лучше сделать все методы просто virtual с пустими телами, а не virtual abstract.

А чем лучше?


суслик   (2004-09-13 15:37:00) [28]

лучше сделать все методы просто virtual с пустими телами, а не virtual abstract.

если я не ошибаюсь try except имеют накладные расходы, которые больше, чем просто вызов пустой функции. а накладные расходы в игре, как мне кажется, недопустимы.


Rem   (2004-09-13 15:36:00) [29]

[8]
 Вот-вот... Указал пользователь объект, говорит: залить бак. Программа заливает, никаких проблем! Оказывается - диван! Куда лили, что лили, и во что это все вылилось? Программист доволен - никаких проверок делать не надо. Пользователь доволен - хохоту сколько - не программа, а анекдот!

И чего накладного в строке if (Object is TMyMercedes) then? Ни на йоту не накладнее try-except-end...

А так - какой-то Бейсик получается.

Если уж хочется простоты - используйте интерфейсы. Запросили интерфейс. Если получили - объект в состоянии выполнять определенные в интерфейсе действия. Не получили - значит этот объект этого делать всего этого не может... Но и тут не все так просто...


Семен Сорокин   (2004-09-13 15:32:00) [30]

чего-то не создаются :(
Аськины шотакты отруби :)
а где нажимать-то?
в объявлении класса, можно через контекстное меню


Ega23   (2004-09-13 15:29:00) [31]

if (CurrentObject is TMyCar) then
TMyCar(CurrentObject).Залить_Полный_Бак;


МЯУ   (2004-09-13 15:24:00) [32]

icWasya ©   (13.09.04 12:42) [3]
чего-то не создаются :(
а где нажимать-то?

Rem   (13.09.04 13:36) [5]
это конечно круто, но тогда при оперировании всеми этими объектами придётся проверять принадлежность к тому или иному классу, что немного накладно. Скажем, пользователь выполнил действия, вызывающие метод "залить полный бак", нужно смотреть, машина ли щяс под курсором или какая-нибудь MySofa... Так что мне больше нравится вариант от Defunct с try/except.. Мож это и не по ООПэвски, но мороки меньше :)


Ega23   (2004-09-13 14:17:00) [33]

Rem   (13.09.04 13:36) [5]

В TMyMercedes мне больше всего Myнравится...  :о)


TUser   (2004-09-13 14:03:00) [34]


> а с методами вот какая ситуация:
> у меня игра в directx, элементы управленяя создаются как
> потомки класса ТэЕлемент, у которово определены абстрактные
> методы mousemove, click, dragdrop и т.п. Так что, например,
> у кнопки всего три реально используемых метода (маусдаун/ап
> и клик), а все остальные воще не нужны.
> Мож, кто подскажет, как сделать лучше?

Надо создавать не один наследник для всего на свете, а иерархию классов, где на разных уровнях и в разных классах вводить ссотв. методы. Тогда не будет ничего лишнего.


Rem   (2004-09-13 13:36:00) [35]

Налицо нарушение наследования.
Создать базовый класс, в котором определено минимальное количество абстрактных методов. От него породить нужные классы.
Кроме этого, от него же определить нового абстрактного потомка, в котором добавлены новые абстрактные методы. И т. д.

TMyObjects --- TMyVehicle --- TMyBicycle
         |                   TMyMotorcycle
         |                   TMyCar --- TMyMercedes
         |                        | --- TMyMazda
         |
         | --- TMyFurniture --- TMySofa
         |                | --- TMyTable
         |
         | --- TMyOffices --- TMyComputer
                        | --- TMyFax


Ega23   (2004-09-13 13:15:00) [36]

Обзови как virtual и abstract и вообще не описывай. Описание нужно будет только у потомков.


icWasya   (2004-09-13 12:42:00) [37]

Ctrl+Shift+C
и все пустые методы создадуться сами


МЯУ   (2004-09-12 12:52:00) [38]

Defunct ©   (10.09.04 23:14) [1]
спасибо, всё замечятельно теперь работает.

а с методами вот какая ситуация:
у меня игра в directx, элементы управленяя создаются как потомки класса ТэЕлемент, у которово определены абстрактные методы mousemove, click, dragdrop и т.п. Так что, например, у кнопки всего три реально используемых метода (маусдаун/ап и клик), а все остальные воще не нужны.
Мож, кто подскажет, как сделать лучше?


Defunct   (2004-09-10 23:14:00) [39]

Можно после вызова: ;)

Try
 Obj.DoSomething;
Except
 ShowMessage('Не перекрыт')
End;

PS: зачем создавать так много (2/3) ненужных методов?


Страницы:   1 2

Наверх

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