![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Возник вопрос по определению принадлежности объекта к классу, а именно, есть класс:
Как я должен написать в методе TRawClass.Method, чтобы узнать, что Owner является ли класс TSecondClass или классом унаследованных от TSecondClass (т.е. TThirdClass)
Это сообщение отредактировал(а) Delphist - 10.1.2011, 01:22 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
см. as
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
is проверяет принадлежность объекта классу или его наследнику, в большинстве случаев этого достаточно. Если нужно отсечь наследников и проверять на точное соответствие, то картина усложняется.
Надёжным вариантом является проверка имени класса, получаемого через метод ClassName, либо проверка напрямую через метод IsClassName. Для того, чтобы не допустить опечаток, можно использовать именованные константы, либо получать имя класса через классовый метод напрямую из нужного класса, что и было продемонстрировано в приведённом коде. Мне было лень это писать, но один голос с оценкой -3 вынудил сделать это. Хотелось бы, чтобы поставивший -3 сделал ответную любезность и обосновал свою позицию. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
БелАмор, не напрягайся
Это сообщение отредактировал(а) superVad - 10.1.2011, 10:37 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Delphist, почитай про операторы as, is, про RTTI.
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Поскольку тут пошла речь про as и is, думаю, нелишним будет обратить внимание на несколько неочевидных моментов:
1. is проверяет на приналдежность классу или его наследнику. 2. is предназначен только для поверки принадлежности классу, являющимся потомком по отношению к классу, к которому относится переменная, ссыляющаяся на проверяемый объект. В случаях, когда принадлежность к классу вытекает из типа переменной, компилятор вообще исключает проверку, подставляя True. 3. as предназначен для приведения типа с проверкой только к потомку, но никак не к предку. При попытке приведения типа к предку через as, as игнорируется. В этом случае следует использовать обычное приведение типа. Ссылка: ПРОГРАММИСТ.Нецелевое использование оператора is |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
||||
|
||||
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Согласен Добавлено @ 13:49
оператор is делает неправильно оценку для моего случая, т.к. в моем TRawClass Ower is TCustomClass, поэтому вызов
а нужно, чтобы если Owner := SecondClass или Owner := ThirdClass, то вызов if Owner is TSecondClass then (или if Owner is Наследники TSecondClass then) возвращал True как это сделать? Это сообщение отредактировал(а) Delphist - 10.1.2011, 13:59 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
я и так про них все отлично знаю, еще раз внимательно посмотрите на мой пример -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Не может ли быть такой ситуации, что на момент вызова TRawClass.Method Owner по какой-либо причине равен nil, например, его вызов происходит в конструкторе до присвоения Owner, или по каким-либо другим причинам?
Указывает ли Owner на реально существующий объект в момент проверки? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| Delphist |
|
||||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Да указывает, и это не важно сейчас. Вопрос мой совершенно в другом направлении, я про то, что если написать
и вызвать
то вместо ожидаемого сообщения, будет тишина, хотя когда создавался RawClass в constructor'e TSecondClass, то RawClass.Owner := Self = SecondClass'y Как заставить if Owner is TSecondClass then правильно отрабатывать Добавлено @ 15:55 на примере показал Это сообщение отредактировал(а) Delphist - 10.1.2011, 15:59 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||||
|
|||||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
А если написать:
... то какое имя класса будет показано перед тишиной? Это сообщение отредактировал(а) БелАмор - 10.1.2011, 16:49 |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
TSecondClass Добавлено через 6 минут и 16 секунд Проблема видать возникает что Owner изначально в TRawClass объявлен как TCustomClass, и поэтому даже присвоение Owner := SecondClass, где SecondClass: TSecondClass не помогает is вернет TCustomClass. А вот как это исправить не знаю, единственный вариант, который пока вижу использовать заместо Owner is TSecondClass использовать виртуальную функцию возвращающий Boolean и переопределять ее у наследников. Правда так не хочется делать -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |