
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (245) « Первая ... 224 225 [226] 227 228 ... 244 245 ( Перейти к последнему сообщению ) |
Сообщ.
#3376
,
|
|
|
Цитата --Ins-- @ Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов. Как это сделать, не делая поле publiс/protected или не геттеров к нему только лишь специально ради этого? Код на Java ![]() ![]() class Base [ private final List field; protected Base(List field) { this.field = field; } } class Derrived extends Base { public Derrived() { super(new ArrayList()); // Как мне тут положить в List элементы? } } Добавлено Флекс, я с++ не могу читать, мне он не понятен, объясни на пальцах Добавлено Цитата D_KEY @ Более того, его может быть придется не только создать, но и проинициализировать тоже по-разному Ну да, смотри код. Инициализирует ПОЛЕ - предок. Потомку лишь делегируется показать чем ![]() ![]() Base = class private field: TList; protected function CreateMyField: TList; virtual abstract; public constructor Create; end; constructor Base.Create; begin field := CreateMyField; end; // В потомке function Derrived.CreateMyField: TList; begin Result := TList.Create; List.Add(bar); List.Add(foo); end; |
Сообщ.
#3377
,
|
|
|
Цитата --Ins-- @ Флекс, я с++ не могу читать, мне он не понятен, объясни на пальцах Ну, по большому счёту - там вариация на тему виртуального конструктора. В базовом классе делается шаблонный фабричный метод, который: 1. Создаёт экземпляр нужного производного класса; 2. Вызывает метод пост-инициализации, внутри которого и вызываются все необходимые виртуальные методы. Пользователь, в итоге, дёргает этот метод и ему возвращается созданный экземпляр класса, должным образом проинициализированный. В производном классе нужно просто перегрузить соответствующие виртуальные методы. |
Сообщ.
#3378
,
|
|
|
--Ins--, да там фактически статический шаблонный метод в базовом классе, который создает объект указанного класса-наследника и дергает виртуальный метод. Т.е. об этом ты тоже говорил, да.
|
Сообщ.
#3379
,
|
|
|
IMHO, переусложнён и совершенно напрасно вводится двухэтапное конструирование. И в примере korvin'а это всё разруливается. |
Сообщ.
#3380
,
|
|
|
Цитата MyNameIsIgor @ IMHO, переусложнён и совершенно напрасно вводится двухэтапное конструирование. В общем случае без двухэтапного конструирования тут не обойтись. ![]() |
Сообщ.
#3381
,
|
|
|
Цитата --Ins-- @ Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов. А в чем принципиальное отличие от числа? Можно просто проинициализировать список элементами, а в случаях, когда нельзя - можно написать внешнюю функцию/статический метод такой инициализации, результат которой передать в конструктор базового класса. |
Сообщ.
#3382
,
|
|
|
Цитата Flex Ferrum @ В общем случае без двухэтапного конструирования тут не обойтись Мой опыт подсказывает, что в общем случае оно и не нужно. А возникает "необходимость" из-за таких вот чисто синтетических задач "нет-нет-нет, никаких protected setter'ов!". Это было во-первых. А во-вторых, как я уже и сказал, даже наш случай решает пример korvin'а со статическим методом. |
Сообщ.
#3383
,
|
|
|
Цитата D_KEY @ А в чем принципиальное отличие от числа? Можно просто проинициализировать список элементами, а в случаях, когда нельзя - можно написать внешнюю функцию/статический метод такой инициализации, результат которой передать в конструктор базового класса. Ins тут прав в том, что таких полей может быть несколько, и они могут предполагать сложную инициализацию. В итоге конструктор базы может быть либо чрезмерно усложнённым, либо будут слишком сильные ограничения на клиентов. Для избежания этих проблем и вводятся "виртуальные" конструкторы. Которые, как можно видеть, довольно легко реализуются на плюсах. Добавлено MyNameIsIgor, случаи, как известно, бывают разные. Не всегда инициализацию можно красиво сделать одноэтапной. |
Сообщ.
#3384
,
|
|
|
Цитата Flex Ferrum @ Ins тут прав в том, что таких полей может быть несколько, и они могут предполагать сложную инициализацию. В итоге конструктор базы может быть либо чрезмерно усложнённым, либо будут слишком сильные ограничения на клиентов. Для избежания этих проблем и вводятся "виртуальные" конструкторы. Которые, как можно видеть, довольно легко реализуются на плюсах. Ну в данном случае можно быть проще. |
Сообщ.
#3385
,
|
|
|
Цитата Flex Ferrum @ вводятся "виртуальные" конструкторы. Это не виртуальные конструкторы, это полиморфные конструкторы. ![]() |
Сообщ.
#3386
,
|
|
|
Цитата D_KEY @ Ну в данном случае можно быть проще. В данном конкретном - да. Добавлено Цитата --Ins-- @ Это не виртуальные конструкторы, это полиморфные конструкторы. Пусть будут полиморфные. Мне как-то по-барабану. ![]() |
Сообщ.
#3387
,
|
|
|
Цитата Flex Ferrum @ Не всегда инициализацию можно красиво сделать одноэтапной В реальных фрэймворках и библиотеках никогда не встречал проблем. Как и двухэтапного конструирования. |
![]() |
Сообщ.
#3388
,
|
|
Цитата --Ins-- @ Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов. Как это сделать, не делая поле publiс/protected или не геттеров к нему только лишь специально ради этого? А что поменяется? Ну так в том случае так же будет, только запись другая. Да и вообще, ситуация, когда базовому классу необходимо знание дочернего, явно намекает на то, что наследование применено не очень-то к месту ![]() |
Сообщ.
#3389
,
|
|
|
Цитата MyNameIsIgor @ В реальных фрэймворках и библиотеках никогда не встречал проблем. Как и двухэтапного конструирования. Нередко это аккуратненько так прячется за pimpl'ом и наружу не торчит. ![]() |
Сообщ.
#3390
,
|
|
|
Цитата MyNameIsIgor @ "нет-нет-нет, никаких protected setter'ов!". Это было во-первых. Потому что это костыль - протектед сеттер только для того, чтобы иметь доступ в конструкторе ![]() |