Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 04.04.16 13:26
Оценка:
Вопрос конечно не сюда, но куда не знаю

Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?
Re: Как назвать метод
От: Lazy Bear Канада  
Дата: 04.04.16 15:10
Оценка: 3 (1)
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


userInit
Re: Как назвать метод, который должен быть переопределен
От: Кодт Россия  
Дата: 04.04.16 15:51
Оценка: 3 (1) +2
Здравствуйте, Рома Мик, Вы писали:

РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


В общем виде,
virtual void init_impl() = 0;


А если этот метод специфичен для каждого конкретного класса (например, рукодельная рефлексия), — то так и назвать
virtual void init_type_specific_info() = 0; // TODO override in EVERY subclass
Перекуём баги на фичи!
Re: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 04.04.16 16:09
Оценка: 3 (1) +1 :)
Здравствуйте, Рома Мик, Вы писали:

РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


кэп: InitOverride. Для поклонников Кэррола — InitOverrideMe, разумеется.

В дотнете одно время предлагался суффикс Core, но на практике он оказался удобнее для методов "не лезь, если не хочешь сломать".
Re: Как назвать метод, который должен быть переопределен
От: Berill Азербайджан  
Дата: 11.04.16 13:54
Оценка: 1 (1) +3
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


Если должен быть переопределен для всех наследников, то может стоит сделать этот метод абстрактным? Это приведет к тому, что класс, от которого должны наследоваться, сам станет абстрактным, и будет выступать в роли шаблона для своих наследников. Тогда мороки с названием и не будет.
Re: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 16:06
Оценка:
Здравствуйте, Рома Мик, Вы писали:
РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?
че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!

такая вещь называется конструктор
Re[2]: Как назвать метод, который должен быть переопределен
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 11.04.16 17:30
Оценка:
Здравствуйте, __kot2, Вы писали:

__>че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!

__>такая вещь называется конструктор

Конструктор вызывается при создании объекта (экземпляра класса), деструктор соответственно при уничтожении. Если эти действия нежелательны, то можно наклепать дополнительные методы.
Re[3]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 18:04
Оценка:
Здравствуйте, velkin, Вы писали:
V>Здравствуйте, __kot2, Вы писали:
__>>че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!
__>>такая вещь называется конструктор
V>Конструктор вызывается при создании объекта (экземпляра класса), деструктор соответственно при уничтожении. Если эти действия нежелательны, то можно наклепать дополнительные методы.
ну так конструктор он, соб-но для инициализации обьекта и создан. если вы снова его инициализируете — вы создаете новый обьект.
вы хотите переиспользовать какие-то буферы от другого сконструированного обьекта? ну так передайте их конструктору
Re[4]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 11.04.16 18:30
Оценка:
Здравствуйте, __kot2, Вы писали:

__>ну так конструктор он, соб-но для инициализации обьекта и создан. если вы снова его инициализируете — вы создаете новый обьект.


Конструктор не всегда удобен. Первый пришедший в голову сценарий: дерево компонентов, надо вызывать Init() только после добавления дерева на форму.
Re[5]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 20:24
Оценка: +1
Здравствуйте, Sinix, Вы писали:
S>Конструктор не всегда удобен. Первый пришедший в голову сценарий: дерево компонентов, надо вызывать Init() только после добавления дерева на форму.
это очень плохо, когда у вас допускается обьект в состоянии "не до конца создан", "не совсем убит" или вообще в каком-то невалидном состоянии. ни разу не видел, чтобы это работало надежно. помните, недавний разговор про глюк в скайпе с дублированием контактов? https://community.skype.com/t5/Mac-archive/double-contacts/td-p/629507 это вот как раз оно — сайд-эффекты раздельного вызова init при добавлении компонента в дерево на форму
Отредактировано 11.04.2016 20:42 __kot2 . Предыдущая версия .
Re: Как назвать метод, который должен быть переопределен
От: vsb Казахстан  
Дата: 12.04.16 01:45
Оценка: 3 (1)
Наверное это плохой вариант, но для полноты информации — в Java почему-то часто в таких случаях используют префикс do, например doInit.

В Objective C часто используются имена вроде viewWillLoad/viewDidLoad. Это уже лучше. Т.е. в вашем случае будет что-то вроде objectWillInitialize/objectDidInitialize. Мне этот вариант нравится больше остальных.
Re[2]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 12.04.16 07:37
Оценка:
Здравствуйте, __kot2, Вы писали:

__>такая вещь называется конструктор

Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
Это можно решить сделав два объекта, и первый будет создавать второй, но и вариант с init тоже есть.
Re[3]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 09:30
Оценка:
Здравствуйте, Рома Мик, Вы писали:
__>>такая вещь называется конструктор
РМ>Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
это ужасно, просто ужасно
Re[6]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 12.04.16 09:54
Оценка: +3
Здравствуйте, __kot2, Вы писали:

__>это очень плохо, когда у вас допускается обьект в состоянии "не до конца создан", "не совсем убит" или вообще в каком-то невалидном состоянии.

Это абсолютно нормальное состояние в любом более-менее сложном графе данных.

Простейшие примеры — данные, подтягиваемые через ORM, лениво заполняемые свойства у AST, настраиваемый логгер, объекты, создаваемые через builder pattern и т.д. и т.п.

Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?
С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.


__>ни разу не видел, чтобы это работало надежно.

Ну, если меры по предотвращению заканчиваются на "это ужасно, просто ужасно" — то очевидно да
Если не лениться и приправить код тестами / ассертами + отладочными инвариантами, то ошибки не пройдут
Re[7]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 13:07
Оценка:
Здравствуйте, Sinix, Вы писали:
S>Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?
S>С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.
я просто работал на нескольких подобных проектах еще после универа. UI вообще провоцирует на подобный говнокод. это не значит, что нельзя сделать по-другому. просто вроде как "удобнее" иметь сложную запутанную логику заполнений обьектов и изменений их состояний.
вы никогда не сможете протестировать это автоматически
и вы убьете кучу своего времени, там, месяцы, на то, чтобы заставить это хоть как-то работать
и оно все равно толком работать не будет

поэтому это ужасно, просто ужасно

обьект конструируется в конструкторе. вы можете это сделать по-другому, но на это должна быть веская причина. "мне так удобнее" и "я так привык" это не причина. должна быть причина по котрой вы именно не можете конструировать его в конструкторе и никак не можете обойти это ограничение
Re[8]: Как назвать метод, который должен быть переопределен
От: baily Россия  
Дата: 12.04.16 13:15
Оценка:
Здравствуйте, __kot2, Вы писали:

__>обьект конструируется в конструкторе. вы можете это сделать по-другому, но на это должна быть веская причина. "мне так удобнее" и "я так привык" это не причина. должна быть причина по котрой вы именно не можете конструировать его в конструкторе и никак не можете обойти это ограничение


Вам и привели пример с веской причиной чуть выше. Даже сделали это два раза. Если вы не считаете данную причину веской а относите ее к категории отмазок, то приведите пример, как можно сделать просто и надежно только на конструкторах.
Re[9]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 15:34
Оценка: +1
Здравствуйте, baily, Вы писали:
B>Вам и привели пример с веской причиной чуть выше. Даже сделали это два раза. Если вы не считаете данную причину веской а относите ее к категории отмазок, то приведите пример, как можно сделать просто и надежно только на конструкторах.
и где этот пример интересно? где код?
у меня не такая буйная фантазия, чтобы представить его. я даже не понимаю, разгоор идет о вебе, где нужно транслировать в html, об игре, где каждый кадр все перерисовывается или о простигоссподи windows-MFC со всякими его refresh и update.
в каждом случае будут наркоманские причины использовать частичносозданные обьекты и, если это правда интересно, я могу показать, как это сделал бы здоровый человек
Re[8]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 12.04.16 15:58
Оценка: +1
Здравствуйте, __kot2, Вы писали:

S>>Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?

S>>С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.

__>я просто работал на нескольких подобных проектах еще после универа. UI вообще провоцирует на подобный говнокод. это не значит, что нельзя сделать по-другому.


Конкретику плиз, пример выше Раздел профильный, это не философия для потрындеть и "вот это — отстой" без аргументов не катит

Если конкретики не будет — топик надо в философию снести.
Re[4]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 12.04.16 20:36
Оценка:
Здравствуйте, __kot2, Вы писали:

__>>>такая вещь называется конструктор

РМ>>Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
__>это ужасно, просто ужасно
На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.
Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
Re[5]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 13.04.16 00:23
Оценка:
Здравствуйте, Рома Мик, Вы писали:
РМ>На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.
РМ>Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
я лично вообще не понимаю зачем обязат иметь недоиниц обьекты
вот мы пишем скайп. у нас есть контакты. есть класс их представления ContactView и контроллер — ContactController

Contact содержит в себе просто инфу о контакте — там, id, имя
struct Contact
{
  id_t id, string nickname;
};

ContactView использует станд компонент нашего гуя - TreeView и слушает инфу об изменении контактов

struct ContactView : public ContactListener
{
  TreeView tree_view;

// ContactListener intervace
  virtual void onload(const Contacts &contacts)
  {
    for (auto &c : contacts)
      tree_view.add_node(ContactItemView(c)); // или просто как вызов on_add()
  }

  virtual void onremove(const Contact &c)
  {
     tree_view.remove(find_tree_node(c));
  }
  .. + on_add + on_change - который может быть реализован для начала просто как on_remove(), on_add()
};

есть ContactController
{
  ContactListener &listener;
  Contacts contacts;
  ContactController(SerializationStuff &s, ContactListener &listener)
  {
    s >> contacts;
    listener.onload(contacts);
  }

  void add(id)
  {
    contacts.push_back(Contact(id));
    listener.onadd(*contacts.rbegin());  
  }
}

где ContactItemView : public TreeItemView
{
  ContactItemView(const Contact &c) : TreeItemView(c.nickname)
  {
     if (birthday(c))
       add_cake();
  }

  add_cake()
  {
    set_image(Image::CAKE)
  }
}

ну и в чем проблема-то? это самый стандартный тупой лобовой способ это сделать.
Re[6]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 13.04.16 07:43
Оценка:
Здравствуйте, __kot2, Вы писали:

РМ>>На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.

РМ>>Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
__>я лично вообще не понимаю зачем обязат иметь недоиниц обьекты
Ну например модуль отвечающий за связь с сервером, он инициализируется асинхронно.
Re[7]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 13.04.16 15:07
Оценка:
Здравствуйте, Рома Мик, Вы писали:
РМ>>>На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.
РМ>>>Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
__>>я лично вообще не понимаю зачем обязат иметь недоиниц обьекты
РМ>Ну например модуль отвечающий за связь с сервером, он инициализируется асинхронно.
на конкретном примере кода могу рассказать как сделать нормально
Re: Как назвать метод, который должен быть переопределен
От: ksg71 Германия  
Дата: 14.04.16 10:57
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


как обычно, иначе — когда он уже будет переопределен, имя с указанием "переопредели меня" начнет путать
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[2]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 14.04.16 19:20
Оценка:
Здравствуйте, ksg71, Вы писали:

РМ>>Вопрос конечно не сюда, но куда не знаю


РМ>>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


K>как обычно, иначе — когда он уже будет переопределен, имя с указанием "переопредели меня" начнет путать

А кого оно будет путать? Вызывать его должна только библиотека, в которой он изначально определен. В идеале бы вообще запретить его видеть всем кроме библиотеки и того, кто переопределяет, причем тот кто переопределяет видеть должен только для переопределения, а вызывать не должен. Но стандартные варианты private и protected такого не позволяют. А еще есть языки, где условно private нету, точнее то, что называется private, на самом деле protected (это haxe).
Re[8]: Как назвать метод, который должен быть переопределен
От: Lexey Россия  
Дата: 15.04.16 23:29
Оценка: +1
Здравствуйте, __kot2, Вы писали:

__>я просто работал на нескольких подобных проектах еще после универа. UI вообще провоцирует на подобный говнокод. это не значит, что нельзя сделать по-другому. просто вроде как "удобнее" иметь сложную запутанную логику заполнений обьектов и изменений их состояний.


Их этого опыта не следует, что это судьба всех подобных решений. У меня вот есть инфраструктура конфигурации, которая использует DataContractSerializer для сохранения/восстановления дерева. Конструктор там использовать не получается от слова "совсем". Но, поскольку все дерево конфигурационных классов со всеми методами инициализации и их вызовами генерируется кодогенератором, то проблем с логикой не наблюдается. Клиенсткий код вообще не видит всей подковерной работы, получая на выходе уже полностью проинициализированное дерево.

__>вы никогда не сможете протестировать это автоматически


Уже смог.

__>и вы убьете кучу своего времени, там, месяцы, на то, чтобы заставить это хоть как-то работать


Первый вариант написан примерно за неделю. Последующие правки были минимальными.

__>и оно все равно толком работать не будет


Прекрасно работает.
"Будь достоин победы" (c) 8th Wizard's rule.
Re[9]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 17.04.16 14:01
Оценка: :)
Здравствуйте, Lexey, Вы писали:
L>Прекрасно работает.
смообман — мощная вещь
apple тоже наверняка думает, что их их iphone прекрасно работает, но я все жду-недождусь уже больше года когда же они поправят баг с переключением аккаунтов (зарегистрировался в одном и сменил на другой), чтобы у меня наконец itunes заработал на телефоне, а не просто крутился и потом тупо игнорировал пароль
Re: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 19.04.16 12:43
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


.ctor
Re[7]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 19.04.16 12:47
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?

S>С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.
Следовать принципе Single Responsibilty и завести 2 обьекта: один рисуется, второй — узел в дереве графов.
Re[8]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 19.04.16 12:59
Оценка:
Здравствуйте, itslave, Вы писали:

I>Следовать принципе Single Responsibilty и завести 2 обьекта: один рисуется, второй — узел в дереве графов.


Я ж сказал — конкретику, а не "мыши станьте ёжиками"

Ещё раз — у вас есть дерево компонентов. Свойства дерева, например, используемый лэйаут, биндинги или выбор стиля отображения должны заполняться при размещении дерева в контейнере.
Попытка работать с деревом _до_ размещения в контейнере — очевидный баг и должно отлавливаться сразу, исключением. Иначе баг так и останется незамеченным и приведёт к куда более забавным последствиям.

Ну, т.е. реальное требование, которое обсуждению не подлежит.


Теперь (в третий раз) вопрос: какой магией вы собираетесь реализовать это требование не вводя концепцию "объект поддерживает инициализацию"?

Только плиз, не надо как предыдущий автор рассказывать про самообман или предлагать обернуть всё в view — типа если инициализация происходит под капотом, то это не считается.
Re[9]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 19.04.16 15:26
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, itslave, Вы писали:


I>>Следовать принципе Single Responsibilty и завести 2 обьекта: один рисуется, второй — узел в дереве графов.


S>Я ж сказал — конкретику, а не "мыши станьте ёжиками"

Какая постановка задачи, такое и решение
Я дальше погадаю на кофейной гуще, постараюсь угадать.


S>Ещё раз — у вас есть дерево компонентов. Свойства дерева, например, используемый лэйаут, биндинги или выбор стиля отображения должны заполняться при размещении дерева в контейнере.

S>Попытка работать с деревом _до_ размещения в контейнере — очевидный баг и должно отлавливаться сразу, исключением. Иначе баг так и останется незамеченным и приведёт к куда более забавным последствиям.
S>Ну, т.е. реальное требование, которое обсуждению не подлежит.

S>Теперь (в третий раз) вопрос: какой магией вы собираетесь реализовать это требование не вводя концепцию "объект поддерживает инициализацию"?

class Container
{

}

class SomeData
{

}

class VisualComponent
{
    public VisualComponent(Container cntr, SomeData relatedData)
    {
    }
}


И вся инициализация происходит в конструкторе компонента. Более того, его невозможно создать, не поместив в контейнер.
Re[10]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 19.04.16 16:49
Оценка:
Здравствуйте, itslave, Вы писали:


S>>Теперь (в третий раз) вопрос: какой магией вы собираетесь реализовать это требование не вводя концепцию "объект поддерживает инициализацию"?

I>И вся инициализация происходит в конструкторе компонента. Более того, его невозможно создать, не поместив в контейнер.

Ну что ж у вас за привычка такая — класть болт на ТЗ, потому что реализовать неудобно

По определению _любое_ visual tree сначала строится, затем подсовывается в контейнер. Причин тому множество, самое простое — вам понравится форма, которая отрисовывается по частям?

Только плиз не надо приводить ad hoc решение именно для этой проблемы, потому что есть ещё тонна других нюансов, которые не решаются при вашем подходе никак. Начиная с перемещения контролов и заканчивая виртуализацией visual tree (неотображаемые элементы не отрисовываются и не создают нагрузку на UI-стек).
Re[11]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 20.04.16 07:54
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну что ж у вас за привычка такая — класть болт на ТЗ, потому что реализовать неудобно

Я же в предыдущем посте прямым текстом написал: какое ТЗ, такое и решение. У меня миелофона нет и телепаты в отпуске, поэтому про ваши нюансы я могу только догадываться.

S>Только плиз не надо приводить ad hoc решение именно для этой проблемы, потому что есть ещё тонна других нюансов, которые не решаются при вашем подходе никак. Начиная с перемещения контролов и заканчивая виртуализацией visual tree (неотображаемые элементы не отрисовываются и не создают нагрузку на UI-стек).


В моем примере виртуализация отрисовываемого дерева уже есть
Давайте кусок кода — будем обсуждать предметно.
Re[12]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 20.04.16 08:08
Оценка:
Здравствуйте, itslave, Вы писали:

I>Я же в предыдущем посте прямым текстом написал: какое ТЗ, такое и решение. У меня миелофона нет и телепаты в отпуске, поэтому про ваши нюансы я могу только догадываться.

Ну а прочитать

С учётом того, что его (дерево компонентов) _сначала_ надо построить, и только затем добавить на форму.

— не?

Эта фича — стандартная возможность для любого боль-менее сложного UI фрефмворка. Вы с ними не работали, возможно?



I>В моем примере виртуализация отрисовываемого дерева уже есть

I>Давайте кусок кода — будем обсуждать предметно.

Блин, да очевидно же. Вот вам самое простое —
control.Parent = anotherWindow;

Нужно, например, для док-панелей с возможностью вытаскивания в отдельное окно.

Допускать, чтобы дерево оставалось в полуразобранном состоянии (у одного компонента привязка к старому окну, у другого — к новому) — низзя по очевидной причине.
Т.е. под капотом снова получаем пару операций "отвязать дерево от старого окна, привязать к новому".
Re[13]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 20.04.16 09:17
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Блин, да очевидно же. Вот вам самое простое -

S>
S>control.Parent = anotherWindow;
S>

S>Нужно, например, для док-панелей с возможностью вытаскивания в отдельное окно.
Это решается враперами с инициализацией в конструкторе, как я и показывал выше.
class ComponentToWindowConnector
{
    ComponentToWindowConnector(Component component, Window wnd)
    {
        component.Parent = wnd;
    }
    void Dispose()
    {
        component.Parent = null;
    }
}
Re[14]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 20.04.16 09:37
Оценка:
Здравствуйте, itslave, Вы писали:


I>Это решается враперами с инициализацией в конструкторе, как я и показывал выше.


Это не решается врапперами, ты просто прячешь за ними внутреннюю кухню и заявляешь, что вот, инициализации не требуется.

Давай ещё раз, ты походу сложность решаемой задачи недооцениваешь.

Всё поведение контрола зависит от родителя. Допустим, в дочернем окне выставлен другой scale или другая ui-тема.
Это приводит к срабатыванию adaptive-триггера, тот, в свою очередь — к смене шаблонов половины контролов, в том числе полной смене поведения этих контролов и к перегенерации всего visual three. Logical three, т.е. инстансы контролов при этом остаются те же. И да, это бизнес-требование, пользователи не хотят, чтобы ссылка на myButton внезапно протухла посреди времени жизни формы.

Ну и как тут нам помогут врапперы?
Re[15]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 20.04.16 10:34
Оценка: 46 (1) +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, itslave, Вы писали:



I>>Это решается враперами с инициализацией в конструкторе, как я и показывал выше.


S>Это не решается врапперами, ты просто прячешь за ними внутреннюю кухню и заявляешь, что вот, инициализации не требуется.

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

S>Всё поведение контрола зависит от родителя. Допустим, в дочернем окне выставлен другой scale или другая ui-тема.

S>Это приводит к срабатыванию adaptive-триггера, тот, в свою очередь — к смене шаблонов половины контролов, в том числе полной смене поведения этих контролов и к перегенерации всего visual three. Logical three, т.е. инстансы контролов при этом остаются те же. И да, это бизнес-требование, пользователи не хотят, чтобы ссылка на myButton внезапно протухла посреди времени жизни формы.

S>Ну и как тут нам помогут врапперы?

Ну вот так же само и помогут. Одни враперы уничтожаются, другие создаются. Логическое дерево не меняется.
Re[16]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 20.04.16 11:00
Оценка:
Здравствуйте, itslave, Вы писали:


S>>Это не решается врапперами, ты просто прячешь за ними внутреннюю кухню и заявляешь, что вот, инициализации не требуется.

I>Так и есть — внутреннюю кухню инкапсулировал в отдельный класс. И я нигде не говорил что инициализации не требуется — вопрос в том где ее делать.

Тьфу, а о чём мы спорим тогда?

Я ж продолжал обсуждать вот это
Автор: __kot2
Дата: 12.04.16
(весьма спорное) утверждение.

Сорри
Re[17]: Как назвать метод, который должен быть переопределен
От: itslave СССР  
Дата: 20.04.16 12:08
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Тьфу, а о чём мы спорим тогда?

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.