добавление функциональности к классу
От: Mark Neumann  
Дата: 30.06.08 20:32
Оценка:
имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).
Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.
Re: добавление функциональности к классу
От: Niemand Австралия  
Дата: 30.06.08 23:37
Оценка:
Здравствуйте, Mark Neumann, Вы писали:

MN>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).

MN>Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.

extension methods?
If the message above is in English — means I'm wasting my work time and work computer to post here. No hard feelings
Re[2]: добавление функциональности к классу
От: Mark Neumann  
Дата: 01.07.08 05:19
Оценка:
кхм.. только надо не метод добавить, а булевый флаг.. и желательно с .NET 2

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

N>Здравствуйте, Mark Neumann, Вы писали:


MN>>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).

MN>>Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.

N>extension methods?
Re[2]: добавление функциональности к классу
От: QrystaL Украина  
Дата: 01.07.08 06:42
Оценка: 1 (1) +1
MN>>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).

Агрегировать...
Re: добавление функциональности к классу
От: Poul_Ko Казахстан  
Дата: 01.07.08 06:45
Оценка: 2 (1)
Здравствуйте, Mark Neumann, Вы писали:

MN>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).

MN>Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.

Может, попробывать поступить также, как это было сделано с Nullable types — завести generic-класс, типа этого:
    public class WithFlag<T> where T:class
    {
        private readonly T _value;
        private bool _flag;

        public bool Flag
        {
            get { return _flag; }
            set { _flag = value; }
        }

        public T InnerValue
        {
            get{ return _value; }
        }

        public WithFlag(T initValue)
        {
            this._value = initValue;
        }

        public static implicit operator T(WithFlag<T> instance){
            return instance.InnerValue;
        }
    }

Каждый инстанс вашего класса должен быть "упакован" в подобный generic-class.
Brainbench transcript #6370594
Re[3]: добавление функциональности к классу
От: Mark Neumann  
Дата: 02.07.08 07:24
Оценка:
да, но получается очень много правки кода, это крайний случай..

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

MN>>>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).


QL>Агрегировать...
Re[2]: добавление функциональности к классу
От: Аноним  
Дата: 02.07.08 07:29
Оценка:
Спасибо, но как я понял сделать обращение к моему начальному классу все равно не получится без обращения как к полю нового класса?

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

P_K>Здравствуйте, Mark Neumann, Вы писали:


MN>>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).

MN>>Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.

P_K>Может, попробывать поступить также, как это было сделано с Nullable types — завести generic-класс, типа этого:

P_K>
P_K>    public class WithFlag<T> where T:class
P_K>    {
P_K>        private readonly T _value;
P_K>        private bool _flag;

P_K>        public bool Flag
P_K>        {
P_K>            get { return _flag; }
P_K>            set { _flag = value; }
P_K>        }

P_K>        public T InnerValue
P_K>        {
P_K>            get{ return _value; }
P_K>        }

P_K>        public WithFlag(T initValue)
P_K>        {
P_K>            this._value = initValue;
P_K>        }

P_K>        public static implicit operator T(WithFlag<T> instance){
P_K>            return instance.InnerValue;
P_K>        }
P_K>    }
P_K>

P_K>Каждый инстанс вашего класса должен быть "упакован" в подобный generic-class.
Re[3]: добавление функциональности к классу
От: Poul_Ko Казахстан  
Дата: 02.07.08 10:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо, но как я понял сделать обращение к моему начальному классу все равно не получится без обращения как к полю нового класса?


Да, имея переменную типа WithFlag<MyClass> обращяться к экземпляру MyClass можно только через свойство InnerValue. Если бы использовался не класс MyClass, а интерфейс, то можно было бы сделать декоратор и обращаться к методам интерфейса непосредственно.
Наличие implicit conversion к типу вашего класса позволяет не использовать свойство InnerValue в некоторых случаях. Т.е.
    class MyClass
    {
        public String value;
        public MyClass(String value)
        {
            this.value = value;
        }
    }
    
    class Program
    {
        static void Print(MyClass myClassObj)
        {
            Console.WriteLine(myClassObj.value);
        }

        static void Main(string[] args)
        {
            WithFlag<MyClass> obj = new WithFlag<MyClass>(new MyClass("test"));
            Print(obj);  // Вот здесь произойдёт неявное приведение, краткая форма для Print(obj.InnerValue)
            MyClass link = obj;   // Вот здесь произойдёт неявное приведение, краткая форма для link = obj.InnerValue
            Console.ReadLine();
        }
    }
Brainbench transcript #6370594
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.