![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ООП
МЯУ © (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) ненужных методов?