【发布时间】:2015-05-12 15:00:44
【问题描述】:
我继承了一个大型代码库,并且正在尝试在框架中实现一些新功能。基本上,为了以“正确”的方式进行操作,我必须修改框架的整个结构。因为我不是设计框架的人,也不是读心者,所以这样做可能不会发生(尽管我真的很想自己从头开始重新设计它)。
所以为了做我想做的事,我正在尝试实现一个装饰器模式。 This answer from maliger 表明我在下面所做的事情是完全有效的。但是,mono 似乎不喜欢它。当我声明 HappyDecorator 时,它抱怨 T 不能派生出来
请原谅这个过于简单的例子,但它明白了重点。
public class HappyObject
{
public virtual void print()
{
Console.WriteLine ("I'm happy");
}
}
public class VeryHappyObject : HappyObject
{
public override void print()
{
Console.WriteLine ("I'm very happy");
}
public void LeapForJoy()
{
Console.WriteLine("Leaping For Joy!");
}
}
public class SuperHappyObject : VeryHappyObject
{
public override void print()
{
Console.WriteLine ("I'm super happy!");
}
public void DieOfLaughter()
{
Console.WriteLine("Me Dead!");
}
}
public class HappyDecorator<T> : T where T : HappyObject
{
public string SpecialFactor { get; set; }
public void printMe()
{
Console.WriteLine (SpecialFactor);
print();
}
}
class MainClass
{
public static void Main (string[] args)
{
HappyDecorator<HappyObject> obj = new HappyDecorator<HappyObject> ();
obj.SpecialFactor = Console.ReadLine();
obj.printMe();
}
}
【问题讨论】:
-
您是否收到错误消息?或者它的行为与预期有何不同?
-
这不是遵循装饰器模式的方式。 obj obect 应该在他的构造函数中获得一个 HappyDecorator。
-
您不能继承泛型类型参数,这正是您的代码示例的错误消息所说的。哪一部分你不明白?
-
听起来你应该摆脱所有 cr_p 并改用
System.Action<T>。创建类只是为了保存这样的函数被称为“名词王国中的执行”,这是一种疾病,主要影响设计糟糕的古老语言,如 java,而 C# 具有适当的特性来处理这个问题,而无需不得不创建无穷无尽的类层次结构。 -
你不能继承
T。要么继承HappyObject,要么注入并包装T。我会选择后者。
标签: c# .net generics inheritance decorator