От: | Философ | http://vk.com/id10256428 | |
Дата: | 16.09.12 22:43 | ||
Оценка: |
От: | Философ | http://vk.com/id10256428 | |
Дата: | 22.09.12 00:28 | ||
Оценка: |
Скрытый текст | |
>>Raziel кое-чего мне до сих пор не хватает. например способа обязать наследников реализовывать нужный мне конструктор. к сожалению этого нет ни в одном известном мне языке >Abaddon фабрики же есть >>Raziel Abaddon, задача не просто реализовать конструктор, а исключить ошибки программистов, которые будут этих самых наследников писать в том числе и свои собственные ошибки тоже исключить вот поробуй набросать код, решающий эту задачу... >Abaddon посредством фиксации конструктора это вряд ли получится кроме того, жэто может сделать невозможным реализацию требующегося функционала >>Raziel как это может? >Abaddon это жесть была бы >>Raziel покажи >Abaddon ну например, есть класс Base::Base(int i), и в наследниках должен быть этот конструктор. А если наследнику требуется дополнительная информация при создании? >>Raziel а как её может предоставить обобщённый код, который будет эти самые экземпляры создавать? вот, допустим, что у нас есть суперХитровыебанная коллекция (кстати, реальная задача) существующее решение таково: коллекция держит "контекст", который она передаёт в фабрику коллекция соответственно обобщённая по типу элементов данных: TEntity, но держит элементы-презентеры (TPresenter), которые и создаёт фабрика т.е. контекст общий никакой дополнительной информации ты туда не запихаешь (разве что на уровне статических полей фабрики — но это изврат) т.е. вполне можно требовать реализацию определённых фабричных методов (или определённых конструкторов). и новые типы "конструкторов" для этой задачи бесполезны >>Raziel а кроме того, обязывание реализации определённых конструторов не накладывает ограничений на дополнительные >Abaddon это для этой задачи бесполезны, а так новые параметры в конструктор передаст фабрика могу даже код привести, где я это применяю >>Raziel пока не надо. там ведь, наверное, большой код, а у меня нет пока желания что-то такое изучать >Abaddon [код выпилен] >>Raziel я пока не понял твоей основной мысли >Abaddon мысль в том, что если бы для ISink был зафиксировать конструктор, реализовать нихрена было бы невозможно пропадает расширяемость системы >>Raziel всё можно было бы реализовать. в данном случае общего конструктора для наследников просто нет, соотвественно и фиксировать его не нужно. т.е. никто ведь тебя не обязывает вводить это ограничение. но сама возможность это сделать была бы полезна >Abaddon вот если бы она была, то она бы не дала ничего реализовать ты ж не знаешь, что понадобиться реализовать в будущем >>Raziel нет, Abaddon, ибо когда ты пишешь класс, то либо предполагаешь, что от него можно будет наследоваться (и пишешь его соответственно), либо даёшь возможность накосячить программерам, которые захотят от него наследоваться. есть ещё третий вариант: объявить класс как sealed >Abaddon ну вот как sealed и объявляй, если хочется зафиксировать смысл ставить какие-то палки в колеса? ну напишет кто-то класс с конструктором заданного вида, который будет что-то из синглтона подтягивать — тебе от этого легче будет? >>Raziel пофигу, ибо экзепляр этого класса по крайней мере можно будет создать (я про такие вещи как Activator) >Abaddon и весь этот гемор ради сраного активатора? нахуй-нахуй >Abaddon поставим вопрос так, а что тебе мешает поискать нужный конструктор? гемор в том, что придется реализовывать бессмысленный конструктор >>Raziel я-то пропишу (если не забуду) а вот посторонний человек, может даже и не знать, что этот конструктор вообще-то необходим >Abaddon ну если он необходим, найди его, если нет — кинь исключение я не вижу проблемы вообще >>Raziel исключение — это рантайм а я хочу такие ошибки перенести в компайл-тайм именно в этом смысл >Abaddon ну так активатор и создает объект в рантайме | |
От: | AndrewVK | http://blogs.rsdn.org/avk | |
Дата: | 22.09.12 00:40 | ||
Оценка: |
От: | Философ | http://vk.com/id10256428 | |
Дата: | 22.09.12 00:56 | ||
Оценка: |
public IUIFactory GetFactory(Type p_type)
{
for (int i = 0; i < m_lstFactories.Count; ++i)
{
if (m_lstFactories[i].ObjectType == p_type)
return m_lstFactories[i];
}
throw new NotImplementedException("No factory for the type " + p_type.Name);
}
От: | AndrewVK | http://blogs.rsdn.org/avk | |
Дата: | 22.09.12 08:05 | ||
Оценка: |
От: | Философ | http://vk.com/id10256428 | |
Дата: | 22.09.12 09:48 | ||
Оценка: |
От: | AndrewVK | http://blogs.rsdn.org/avk | |
Дата: | 22.09.12 12:45 | ||
Оценка: |
От: | Философ | http://vk.com/id10256428 | |
Дата: | 23.09.12 19:13 | ||
Оценка: |
От: | AndrewVK | http://blogs.rsdn.org/avk | |
Дата: | 23.09.12 19:23 | ||
Оценка: |
interface IUIFactory
{
IButton CreateButton();
}
class SpecificFactory
{
public IButton CreateButton()
{
return new Button();
}
}
...
IUIFactory factory = ...;
var button = factory.CreateButton();
От: | Философ | http://vk.com/id10256428 | |
Дата: | 23.09.12 19:54 | ||
Оценка: |
public class CSelector<T>
{
protected IWidget CreateWidget(CAspect p_aspect)
{
var factory = CUIBroker.Item.GetFactory(typeof(T));
return factory.CreateWidget(p_aspect);
}
}
От: | AndrewVK | http://blogs.rsdn.org/avk | |
Дата: | 23.09.12 20:01 | ||
Оценка: |
От: | Sinclair | https://github.com/evilguest/ | |
Дата: | 15.11.12 06:42 | ||
Оценка: |
public class NamedArray<T>
where T: new(string); // вот было бы охрененно, но не работает
{
public string Name{get;set;}
...
public int Count {
get { return _count;}
set {
var count = _count;
Resize(value);
while(count < value)
this[count++] = new T(Name); // сложность тут
}
}
public class NamedArray<T>
{
public NamedArray(Func<string, T> factory)
{
_factory = factory; // вот оно!
}
...
public int Count {
get { return _count;}
set {
var count = _count;
Resize(value);
while(count < value)
this[count++] = _factory(Name);
}
}
var a = new NamedArray<City>((name)=>new City(name));