C#, интерфейс на структуру.
Что ты хочешь получить? Зачем тебе потребовалась такая возможность?
IIntContainer ii = (IIntContainer)i;
ii.Value = 42;
Console.WriteLine("Answer : {0}", ii.Value);}
А кто знает про такую штуку в 2.0: слышал что в новых коллекциях оптимизировали реализацию IEnumerable с помощью структур -- как это?
Один фиг, естественно.
меня вдруг стукнуло в голову попытаться потайпкастить структуры, типа эффективней чем flyweight (мне покпок подсказал!) будет. Может быть
Так ты же не можешь делать вируальные вызовы у структур пока они в стеке, они для виртуальных вызовов и приведений к интерфейсам боксятся.
да нет, не один фиг. таким макаром получишь 1 раз забоксенную копию структуры в стеке. в консоле - 42.
Я правильно понял flyweight, как создание нескольких классов (объектов) как бы взглядов над одними и теми же данными?
например, так:
class FlyWeight
{
public int Index;
public int Value
{
get {return data[Index] + 256 * data[Index+1];
set {data[Index] = value % 256; ... }
}
}
FlyWeight fly= new FlyWeight;
for (int i = 0; i < 10000; i+=2)
{
fly.Index = i;
fly.Value = fly.Value + 1;
}
А у меня была мысль сделать жуткий гибрид флайвейта и декоратора, причём в процессе как-нибудь тайпкастить структуры.
Типа, у меня есть дерево, которое я хочу реализовать в виде массива нод, причём каждая нода одного размера, но ноды бывают двух типов с существенно различными данными. Технически реализовать юнион очень просто, я это могу. А вот как бы правильно разделить два типа нод на два класса...
только как это связано с названием паттерна?
слушайменя
внутри объекта FlyWeight могут быть какие доп. данные, кэши и т.д.
Соответственно, если все такие объекты держать в памяти - то будет "плохо", поэтому обычно в памяти держат только persist-ентные данные, а все остальное создается не надолго по требованию (на лету)
т.е. FlyWeight - образуется от двух слов - на лету и легкий.
так это и есть то, о чем я говорю
и мой пример с FlyWeight-ом делает все тоже самое - функциональность есть, а инкапсуляции - нет.
Но мне-то надо изменить поле уже существующей структуры.
теперь точно понял
хорошо согласуется
один в один с моими словами
единственное, что у них не показано, это то, что в пуле обычно weakreference-ы сидят (но это, конечно, уже от языка зависит)
Оставить комментарий
bleyman
Конечно же печатает 0, потому как на самом деле создаётся копия i в куче (а не в стеке а затем на неё начинает указывать временная безымянная переменная типа IIntContainer.
Вопрос: её никак нельзя обмануть?
Примечание: меня вдруг стукнуло в голову попытаться потайпкастить структуры, типа эффективней чем флайбай будет. Может быть.