имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа).
Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.
Здравствуйте, 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
кхм.. только надо не метод добавить, а булевый флаг.. и желательно с .NET 2
Здравствуйте, Niemand, Вы писали:
N>Здравствуйте, Mark Neumann, Вы писали:
MN>>имеется достаточно большой класс, к которому надо прилепить поле с флагом. унаследовать его нельзя (конструкторы защищены проверкой типа). MN>>Как можно решить проблему? пока я нашел только 1 способ — pattern'ы (имею в виду декоратор), но для таких больших классов они вроде мало подходят.
N>extension methods?
Здравствуйте, 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.
да, но получается очень много правки кода, это крайний случай..
Здравствуйте, 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.
Здравствуйте, Аноним, Вы писали:
А>Спасибо, но как я понял сделать обращение к моему начальному классу все равно не получится без обращения как к полю нового класса?
Да, имея переменную типа 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();
}
}