Финализация виртуальных методов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Финализация виртуальных методов

Сообщение Max Rusov » 17.12.2009 18:14:58

Уж поверь мне - ничего я не путаю.

Добавлено спустя 2 минуты 41 секунду:
Вот, простой пример вспомнил: попробуйте на VCL сделать MDI приложение без скроллеров в клиентской области. Без хака.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Финализация виртуальных методов

Сообщение скалогрыз » 17.12.2009 18:31:09

Max Rusov писал(а):Чего ты хочешь добиться? Доказать что я дурак и можно было обойтись без Hack'а? Подобные примеры довольно трудно привести, потому что они обычно встречаются, когда решаешь нестандартные задачи.

я не хочу ничего ни о ком плохого говорить, или доказывать что кто-то из нас двоих идиот.
Мне тоже приходилось решать нестандартные задачи, но ни разу мне не приходилось стучаться к private.
Вообще, самый жуткий хак VCL-а, это наличие у каждого WinControl-а, есть свойство Handle. :) Привет WinAPI и любым Windows возможностям.

2 Mr.Smart. ну это полулегальный способ объявить наследника и получить доступ к protected... пользовался пару раз :) по-идее, он легальный, хотя и не очевидный (для новичка).
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Финализация виртуальных методов

Сообщение AbakAngelSoft » 17.12.2009 18:38:38

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

можно но не нужно!
скалогрыз писал(а):можно ли пример, где это нужно?!

иногда на самом деле нужно, Max Rusov прав. Но только потому что определенный класс, повторюсь, не верно спроектирован. Завтра покопаюсь в своих проектах и приведу пару примеров из реальной жизни стандартных классов vcl.
Max Rusov писал(а):сделать приложение в котором было бы 2-MDI формы

А в чем была сложность если не секрет?
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар

Re: Финализация виртуальных методов

Сообщение Max Rusov » 17.12.2009 18:44:38

Полюбуйся, как в VCL реализованы методы GetMDIChildCount/GetMDIChildren. Вообще пример не очень удачен, тут даже Hack классы не помогли, пришлось Forms править...
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Финализация виртуальных методов

Сообщение and » 17.12.2009 22:31:31

2скалогрыз: Что-то я не понял вот это. Такая конструкция помогает добраться до private?
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Финализация виртуальных методов

Сообщение скалогрыз » 17.12.2009 23:13:02

and писал(а):2скалогрыз: Что-то я не понял вот это. Такая конструкция помогает добраться до private?

аха. Структура классов THackList и TList будет совподать.
Но это нелегально, и чревато последствиями в тех случаях, когда внутреняя реализация класса TList изменится.

ох... дурной пример заразителен.

ЗЫ: ещё раз повторюсь, что мне ниразу не пришлось использовать подобный способ. Мне проще было бы сделать copy-paste и "доделать" уже новый класс, чем, что-либо хакать ))
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Финализация виртуальных методов

Сообщение alexrayne » 18.12.2009 01:38:11

to AbakAngelSoft
по поводу предусмотрительности при проектировании классов. если вы проектируете какойто свой локальный класс который никому насторону выкладывать ненамерены, то очень возможно поверить что можно предсказать как оно будет использоваться и заприватить\опубликовать только то что нужно. (только накой ето надо если для себято? я свои классы делю только на публик и протектед и то только для того чтоб в инспекторе кода методы както упорядочить)
а если посмотреть на глольные либы VCL,FCL,LCL... которыю пользуют массы, то будь Вы хоть 20ти пядей волбу предсказать как оно потребуется использовать\изменять\наворачивать неполучиться, а если и постараться времени и сил на ето убьется значительно больше чем эффекта от такого разграничения доступа. по любому криворукость исправляется набитыми шишками а не хлыстами и стопзнаками

>>Но отказ от строгости это дорога в анархию и неработающий код с трудноуловимыми багами.
лично я для себя уяснил что безглючный код - ето хорошо протестированый код, а не код который написан строго - про такой код могу только говорить что он компилируется. Хороший пример в етом Pyton - куча кода на нем рубится, но чтото он никак не загнется от недостатка срогости.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Финализация виртуальных методов

Сообщение AbakAngelSoft » 18.12.2009 11:08:18

К сожалению не локальный и не для себя. Тогда бы я все оставил в public в том числе и поля.
alexrayne писал(а):будь Вы хоть 20ти пядей волбу

В этом и заключается работа программиста!
alexrayne писал(а):криворукость исправляется набитыми шишками а не хлыстами и стопзнаками

Не правильный у Вас подход.
"набитые шишки" программирования:
http://www.lenta.ru/world/1999/10/01/nasa/
http://ru.wikipedia.org/wiki/Therac-25
http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D0%B0%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D1%8B-%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8F_%D0%90%D1%80%D0%B8%D0%B0%D0%BD_5_(4_%D0%B8%D1%8E%D0%BD%D1%8F_1996)
http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%B8%D0%BD%D0%B5%D1%80-1
Естественно, на слуху только те которые обошлись в миллиарды долларов, а сколько "мелких" ошибок программирования, которые обошлись всего в несколько миллионов долларов, никто просто не считал.
Как можно было оттестировать посадочный модуль марсохода на земле? К сожалению не смог найти статью где рассказывалось что автоматические тесты на земле в том числе и моделирование посадки весь комплекс проходил на ура!
Отсюда вывод: никогда не надо надеяться на тестирование и ни в коем случае нельзя превращать в тестеров пользователей.
Я не предлагая отказаться от тестирования, но считаю, что ориентироваться только на него чревато проблемами.
Я работаю в миллион рублевом проекте, но думаю мне не простят ошибки вроде марсохода. :)
alexrayne писал(а):Хороший пример в етом Pyton - куча кода на нем рубится, но чтото он никак не загнется от недостатка срогости.

Куча кода рубится на C, но вы каким то образом оказались на этом сайте... :)
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар

Re: Финализация виртуальных методов

Сообщение alexrayne » 18.12.2009 21:19:07

>>Куча кода рубится на C, но вы каким то образом оказались на этом сайте... :)
ето мое детство с етого начинал. вообще работаю с ембеббедом - а там паскаль невариант. такчто как ниплачь а Си рулит.

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

Я довольно плотно поработал в ВДХЛе (он наследник Ады), местами его жесткость меня бесить начинала, писал также код на верилоге(он наследник С). и там и там количество ошибок было немеряное и единственный способ сделать устройство более менее работающим - отладить его на тестбенчах. у программистов уже методология образовалась - половина труда на разработку программы, половина - на тестирование.
Так вот на верилое прога пишется както проще, нетак компилятор достает.
после написания пары ядер я меня появилось чень четкое ощущение что начиная с некоторого порога сложности программы совершенно безразлично насколько вы умны и насколько быстро просчитываете зависимости - упустите одну, повалится все. такчто хороший моделер и набор тестов становится единственной гарантией.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Финализация виртуальных методов

Сообщение скалогрыз » 18.12.2009 23:12:31

alexrayne писал(а):(то что надежность неособо людям нужна, могу подтвердить по ряду моих переругиваний с Марко ванДерротом или Джонасом Маебе - они нивкакую нехотят вносить элементы ады или оберона в их паскаль, только дельфя для них икона)

Marco van de Voort? да, они оба консерваторы :)
но форк они же не запрещают сделать ;)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Финализация виртуальных методов

Сообщение Climber » 18.12.2009 23:30:28

Сейчас пришло в голову...
Если сделать public метод (не virtual), а внем вызывать скрываемый метод, который private - то получится то же самое, что и с final. То есть метод доступен в потомках, но перекрыть нельзя. Или нет?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Финализация виртуальных методов

Сообщение alexrayne » 18.12.2009 23:33:38

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

Добавлено спустя 59 секунд:
Climber писал(а):Сейчас пришло в голову...
Если сделать public метод (не virtual), а внем вызывать скрываемый метод, который private - то получится то же самое, что и с final. То есть метод доступен в потомках, но перекрыть нельзя. Или нет?


inherited все равно можно вызвать
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Финализация виртуальных методов

Сообщение AbakAngelSoft » 20.12.2009 13:54:52

Climber писал(а):Если сделать public метод (не virtual), а внем вызывать скрываемый метод, который private - то получится то же самое, что и с final. То есть метод доступен в потомках, но перекрыть нельзя.

Есть класс
Код: Выделить всё
TA = class (TObject)
protected
  function MyProc: Int64; virtual;
end;

от него порождаются:

Код: Выделить всё
TB = class (TObject)
protected
  function MyProc: Int64; override;
end;

TC = class (TObject)
protected
  function MyProc: Int64; override;
  function MyProcNew: Integer; virtual;
end;


Потомки TB могут безопасно перекрывать MyProc, а для потомком TC перекрытие этого метода чревато ошибками. Для них введен новый метод MyProcNew. Но народ будет "по привычке" перекрывать MyProc. :(

PS Может пример слишком надуман, но больше ничего в голову не пришло, что бы объяснить на пальцах. А выкладывать весь проект, где это встретилось, слишком объемно, да и не open source - начальство заругается.

Добавлено спустя 5 минут 21 секунду:
Еще пример: если бы в коллекцию класс item-ов не передавался в конструкторе, а запрашивался динамически через виртуальный метод, то породив коллекцию с определенными типом элементов было-бы неплохо защитить код от получения неверного класса во время компиляции, а не в runtime.
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru