C#, интерфейс на структуру.

bleyman


interface IIntContainer
{
int Value {get;set;}
}
struct IntImpl : IIntContainer
{
public int a;
public int Value { get { return a; } set { a = value; } }
}
public static void main
{
IntImpl i;
(i as IIntContainer).Value = 42;
Console.WriteLine("Answer : {0}", i.a);
}

Конечно же печатает 0, потому как на самом деле создаётся копия i в куче (а не в стеке а затем на неё начинает указывать временная безымянная переменная типа IIntContainer.
Вопрос: её никак нельзя обмануть?
Примечание: меня вдруг стукнуло в голову попытаться потайпкастить структуры, типа эффективней чем флайбай будет. Может быть.

Helga87

Что ты хочешь получить? Зачем тебе потребовалась такая возможность?

xz_post

а если так сделать
IIntContainer ii = (IIntContainer)i;
ii.Value = 42;
Console.WriteLine("Answer : {0}", ii.Value);}

bastii

А кто знает про такую штуку в 2.0: слышал что в новых коллекциях оптимизировали реализацию IEnumerable с помощью структур -- как это?

bleyman

Один фиг, естественно.

bleyman

меня вдруг стукнуло в голову попытаться потайпкастить структуры, типа эффективней чем flyweight (мне покпок подсказал!) будет. Может быть

bastii

Так ты же не можешь делать вируальные вызовы у структур пока они в стеке, они для виртуальных вызовов и приведений к интерфейсам боксятся.

xz_post

да нет, не один фиг. таким макаром получишь 1 раз забоксенную копию структуры в стеке. в консоле - 42.

bastii

Я правильно понял flyweight, как создание нескольких классов (объектов) как бы взглядов над одними и теми же данными?

Dasar

Скорее, как создание одного взгляда на разные данные.
например, так:

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;
}

bleyman

В книжке "Приёмы Объектно Ориентированного Проектирования" в качестве основного примера флайвейта приводится объект, реализующий функциональность но не инкапсулирующий символ строки, типа для повышения эффективности. Так что ты фигню сказал, кажется.
А у меня была мысль сделать жуткий гибрид флайвейта и декоратора, причём в процессе как-нибудь тайпкастить структуры.
Типа, у меня есть дерево, которое я хочу реализовать в виде массива нод, причём каждая нода одного размера, но ноды бывают двух типов с существенно различными данными. Технически реализовать юнион очень просто, я это могу. А вот как бы правильно разделить два типа нод на два класса...

bastii

а, понял
только как это связано с названием паттерна?

bleyman

онгонитнеслушайего
слушайменя

Dasar

> только как это связано с названием паттерна?
внутри объекта FlyWeight могут быть какие доп. данные, кэши и т.д.
Соответственно, если все такие объекты держать в памяти - то будет "плохо", поэтому обычно в памяти держат только persist-ентные данные, а все остальное создается не надолго по требованию (на лету)
т.е. FlyWeight - образуется от двух слов - на лету и легкий.

Dasar

> реализующий функциональность но не инкапсулирующий символ строки, типа для повышения эффективности
так это и есть то, о чем я говорю
и мой пример с FlyWeight-ом делает все тоже самое - функциональность есть, а инкапсуляции - нет.

bleyman

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

bastii

нашел картинку
теперь точно понял

Dasar

> как с этим согласуется?
хорошо согласуется
один в один с моими словами
единственное, что у них не показано, это то, что в пуле обычно weakreference-ы сидят (но это, конечно, уже от языка зависит)
Оставить комментарий
Имя или ник:
Комментарий: