C# Замените декоратор компонента новым - PullRequest
0 голосов
/ 01 марта 2020
public class Decorator : ICommonInterface
{
    ComponentType baseRef {get; set;}
    ComponentFunction //Function that i want to modify with the Decorator
    {
        //Additional stuff i want to do here
        baseRef.ComponentFunction() // do stuff
    }
}
public class DecoratedClass : ICommonInterface
{
    ComponentFunction(){ //do stuff }
}

Это в значительной степени то, как я определяю свой декоратор. Я использую это так:

main(){
    DecoratedClass _base = new DecoratedClass();
    Decorator _end = new Decorator(_base);
    _end.ComponentFunction() // I use the Decorator _end ComponentFunction instead of
                             // doing _base = new Decorator(_base) so i keep base reference
}

Но в какой-то момент внутри main мне придется сделать что-то вроде:

main(){
    // some point later inside main
    _base = new ClassThatInheritsFromDecoratedClass()
}

Я все еще буду использовать _end переменная для вызова ComponentFunction (), но _end имеет старое значение _base. В C / C ++ я мог бы поиграть с указателями и не использовать ключевое слово new для переопределения _base или чего-то еще, но возможно ли изменить _base так, как в C#, и _end.baseRef будет новым значением _base не делая что-то вроде:

_end.baseRef = _base

после того, как я изменил _base с ключевым словом new ?

1 Ответ

0 голосов
/ 01 марта 2020

Допустим, у вас есть базовый объект, а кроме того, у вас есть декоратор A и декоратор B. Итак, теперь вы хотите изменить базовое значение без повторного декорирования его с помощью A и B.

Один трюк, чтобы иметь класс-оболочку, такой как

public class DecoratedClassWrapper {
    public DecoratedClass RealBase { get; set; }
}

Затем в Main ()

Main()
{
    DecoratedClassWrapper _base = new DecoratedClassWrapper();
    Decorator _end = new Decorator(_base);
    _end.ComponentFunction(); // I use the Decorator _end ComponentFunction instead of
                             // doing _base = new Decorator(_base) so i keep base reference
    _base.RealBase = new Something();
    _end.ComponentFunction(); // Now, this will executed with new "real" base.
}
...