![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
У меня в классе должны быть неизменяемые во время работы объекта константы.
Как правильнее реализовать: 1) Инициализировать поле во время создания объекта и отдавать его свойством. 2) Просто возвращать функцией. Да и - Делфи 7. Это сообщение отредактировал(а) superVad - 12.7.2011, 23:05 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
А просто объявить константы нельзя?
Const a = 10; b = 20; |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
Akella, есть родительский класс, его потомки отличаются некоторыми "константами". Но в самом классе константу не объявить.
Может само слово константа не правильно подобрано... |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Наверно неправильно. Потомки класса не должны отличаться друг от друга только некоторой "константой", которую можно "отдавать как свойство" (у них и так разные классы) или результатом некоей функции предка. Имхо стоит немножко приблизить данную задачу к "Задаче Х" с одновременным удалением от "Задачи Y". P.S. Соответствующую сагу ты должен знать. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
Ну ладно, классы отличаются еще и некоторыми методами. Но все же: 1) Инициализировать поле во время создания объекта и отдавать его свойством. 2) Просто возвращать функцией:
Это сообщение отредактировал(а) superVad - 13.7.2011, 00:25 |
|||
|
||||
| northener |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Ты меня не понял. Классы - потомки некоего класса отличаются уж тем, что они - суть разные классы!
TFirstChildOfMyClass и TSecondChildOfMyClass - разные классы. И оператор Is примененный к экземплярам(объектам) данных классов это подтвердит. Добавлено через 2 минуты и 20 секунд
И всё же я напоминаю про сагу. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
||||
|
|||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
superVad,
приведи примеры классов, думаю так всем понятнее будет |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
А ещё лучше озвучь задачу, для которой тебе нужны "константы в классе".
-------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
Это связано с отчетами.
В родителе находятся всякие общие для всех отчетов методы. Потомки отличаются как способом подсчета данных, так и в них должны быть - количество колонок, их названия, запросы... И эти данные не меняются во время работы методов объекта. Как их правильней объявить. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
Возвращаемое функцией значение тоже как бы изменить сложно По мне первый вариант выглядит как то правильней. Но во втором можно сделать методы класса и обращаться к ним без создания объекта, если надо конечно. |
|||
|
||||
| 1000000dollars |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 6.10.2007 Репутация: нет Всего: 8 |
Я бы сделал свойством. Примерно так:
интерфйс фиксирован, а значение хочешь константное, хочешь вычисляемое и всё прозрачно PS: делфи под рукой нет и давно на нём не писал - так что могут быть ошибки. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
1000000dollars, спасибо за совет. Похоже на вариант 2, но значение функции читается через свойство, что мне кажется излишне.
|
|||
|
||||
| de_Nis |
|
|||
![]() Старательный ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 19.10.2006 Где: Молдова Репутация: нет Всего: 6 |
Возможно, это прописные истины, но все же:
1) Если все классы в одном модуле, константы можно объявить в разделе implementation этого модуля. 2) Можно выделить константы в отдельный модуль, подключаемый при необходимости. Это сообщение отредактировал(а) de_Nis - 13.7.2011, 13:07 --------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет… |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
Вечером постараюсь набросать маленький вариант
Это сообщение отредактировал(а) Keeper89 - 13.7.2011, 20:42 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Если "константы" используются базовым классом, а переопределяются в потомках, то тут только виртуальная функция
-------------------- Обижено школьников: 8 |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
||||
|
||||
| 1000000dollars |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 6.10.2007 Репутация: нет Всего: 8 |
||||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
||||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
superVad, вот пример
если неправильно понял - жду пояснений Это сообщение отредактировал(а) Keeper89 - 13.7.2011, 20:44 |
|||
|
||||
| 1000000dollars |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 6.10.2007 Репутация: нет Всего: 8 |
Использование свойства следует из постановки задачи - желаемая константа - это значение, которое не может быть произвольно изменено извне объекта. Гибкость в том, что работает полиморфизм (отсюда виртуальные методы и их перекрытие в потомках). Получается, что клиенты классов получают константное значение (чего они и ожидают), а объект отдаёт значение, согласующееся с его логикой. В примере ниже три класса: таблица (базовый класс), статическая таблица (количество строк реально константное) и динамическая таблица (количество строк вычисляется). В массив из таблиц помещаю и статические и динамические таблицы, и при последующем обращении получаю корректное значение количества строк - для статических - их статическую константу, для динамических - текущее значение. Если всё сделать через метод, то в базовом классе (C_Table) придётся заводить специальное поле, инициализировать его и писать метод, возвращающий его значение (в случае C_StaticTable можно обойтись без этого) - а это лишний код, лишний расход памяти и времени выполнения.
Добавлено через 4 минуты и 33 секунды Keeper89, на тех же классах
|
||||
|
|||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
Не уловил. Может из-за жары - но не понятно, что это за поле в базовом классе, зачем его инициализировать... В общем я согласен - лучше использовать свойства. Они дают какую то дополнительную абстракцию, в будущем для внесения изменений может пригодится. Но я не понял именно твоей аргументации Добавлено @ 11:14 Спасибо всем за помощь. Главное, что для себя я осознал, что этот вопрос можно решить 2 способами - в принципе равнозначными. 1) Keeper89 Инициализировать поля в конструкторе виртуальным методом (или прямо в конструкторе, перекрывая его). 2) 1000000dollars Возвращать значения виртуальными функциями. Формально это даже правильнее, т.к. эти значения точно не изменяемые. Ну и естественно все это делать надо через свойства. ПС Как подсказал CodeMonkey в более новых Делфи уже реализованы классовые константы. Жаль в 7 их еще нет :( Это сообщение отредактировал(а) superVad - 14.7.2011, 11:16 |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
А заполни массив такой "константой",и сравни время заполнения. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "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. |