|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.04.2011, 13:39 | #1 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Определение типа класса по переменной на объект этого класса при компиляции
Задача такая у меня, возможно, покажется извращенской.
Имеем такое: Код:
Пробовал вот что : cls.classtype - не подходит гуглил возможность перевода имени класса в идентификатор класса (если я корявый, ткните в меня google/lmgtfy ссылкой) есть возможно хитрости с класстайп и классинфо, но они вроде только на рантайм, а мне надо компайл-тайм Мне кажется, что есть какое-то изящное решение. Например, когда мы в дельфи наводим мышкой на переменную объектного типа, то видим её тип, возможно , этому есть инструмент дельфи какой-то, хотя скорее всего, это делает среда. Грубыми словами, мне надо вместо самого идентификатора класса получать его(идентификатор класса) из переменной экземпляра класса. Спасибо вам, гуру ! Вполне допускаю, что будут ответы : так все и делают ! но, может, быть всё-таки, можно задать только 1 раз имя класса, в var ? Последний раз редактировалось phomm; 07.04.2011 в 13:49. |
07.04.2011, 14:07 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Если я правильно понял. то структура TVarRec;(System.pas) поможет. Там же TVarType и TVarData
Ещё есть TValueType Последний раз редактировалось Человек_Борща; 07.04.2011 в 14:15. |
07.04.2011, 14:07 | #3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Есть вариант cls := tsomeclass(sender); а больше ни как
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
07.04.2011, 14:20 | #4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Integer(cls) := Integer(sender);
Но это ппц как небезопасно. Я бы шесть раз подумал, прежде чем такое делать, и... так и не сделал бы. P.S. Классы и объекты не путай.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
07.04.2011, 16:06 | #5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Если я правильно понял задачу (в чём я сомневаюсь), есть некая иерархия классов:
Код:
Код:
Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
07.04.2011, 17:42 | #6 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Всем спасибо , что откликнулись, всем плюсы )
Человек_Борща, почитал справку, по-моему к моему случаю сие не относится Аватар, этот случай даже не рассматриваю ) он всё равно ведь с использованием Tsomeclass , да и приведение типов для классов лучше делать с as, ибо генерит исключение при несоответствии, в отличие от прямого приведения(как Вы указали) GunSmoker, спасибо, очень дельный совет, я предполагал , что есть подобное решение из разряда хаков, скорее всего, конечно, не буду использовать, опасность такого метода, полагаю, заключается в отсутствии приведения типов ? ведь sender может быть и потомком оригинального класса veniside, я так понял, Вы расписали шаблон/паттерн Builder , вполне возможно, если вывести функцию, которая будет "строить" объекты, то можно достигнуть означеной цели, но мне кажется указания конкретного класса избежать не удастся, хоть и будет опосредовано (в функции), ведь класс надо передавать в функцию (в Вашем примере Tcat), да и решение, всё же достаточно объемным будет (я рассчитывал на пару строчек) Хотелось бы несколько прояснить , возможно, так будет яснее, имеем такое дело : Код:
Извините, я понимаю что приведенный пример сферичен в вакууме, и проще написать cls := sender as Tsomeclass1, а при необходимости перенастроить, объявить cls : tsomeclass и нажимая F9 просто переписать те несколько строчек на другой класс, но надежда на некий красивый выход есть, ведь я уже приводил пример со средой дельфи, может что-то такое.... Последний раз редактировалось phomm; 07.04.2011 в 18:31. |
07.04.2011, 18:05 | #7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Есть ещё TClassList
|
07.04.2011, 18:33 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> возможно, так будет яснее
честно говоря, понятней не стало. Проблема даже не в классе, а вот в этом: Код:
Ну вот сменили вы класс у cls с tsomeclass1 на tsomeclass2. Оба эти класса должны иметь методы do1() и doN(), так? Тогда почему бы не сделать для них базовый класс tsomeclassbase, эти методы объявить виртуальными и насладиться работой ООП в действии?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
07.04.2011, 19:01 | #9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
кажется , получилось... сам не верю , что не аксесвиолейшенит, копирую прямо из проекта, чтобы не на абстрактном примере.
Код:
Получается, что теперь идентификатор для тайпкаста можно вынести в секцию объявления, и не заботиться о перекройке проекта, всё будет автоматом Хочется ещё узнать, легально ли такое ? не будет ли проблемок ? |
07.04.2011, 19:40 | #10 |
Форумчанин
Регистрация: 06.12.2010
Сообщений: 300
|
Нечто странное у вас. В любом случае работа с одним классом как с другим возможна только если они совместимы. К примеру TForm1 и TForm совместимы:
Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов | Lanx | Помощь студентам | 0 | 06.04.2011 20:24 |
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? | Farrel | Общие вопросы C/C++ | 2 | 13.11.2010 17:37 |
Создание класса с полем типа TStringList. Ошибка при его заполнении | Son | Общие вопросы Delphi | 8 | 13.04.2010 21:38 |
Параметр конструктора класса = объект этого класса | nazavrik | Общие вопросы C/C++ | 6 | 14.02.2010 13:48 |
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? | TwiX | Общие вопросы Delphi | 3 | 15.11.2009 00:54 |