【发布时间】:2012-01-17 23:56:48
【问题描述】:
我的这个基类具有以下接口:
abstract class Base
{
abstract public object Val
{
get;
}
}
对于任何派生类,Val 的值必须在对象创建时指定。
问题是:我如何制作派生类来做到这一点(希望在编译时)?
我尝试添加一个构造函数:
abstract class Base
{
public Base(object value)
{
val = value;
}
private object val;
...
}
但正如您所见,我必须声明一个私有字段来在其中存储值(因为 Value 是只读的)。
出现问题是因为我想使用 GoF 设计模式中引入的装饰器/包装器模式为派生类添加某种效果。但是因为我已经在 Base 类中声明了该字段,所以装饰器会一直保存相同数据的副本,我最终会浪费内存。
【问题讨论】:
-
装饰器是一个持有另一个对象的对象,因此您显然需要两个对象的内存。这正是您的解决方案所需的内存。如果这不适合您,您可能误用或误解了装饰器模式。你到底想解决什么问题?
-
如果我在 Base 类中只定义属性(而不是字段),那么装饰器实际上不必存储 Base 成员的任何其他副本。
-
装饰器不存储任何基本成员的副本。它只是存储对装饰对象的引用!?
-
它也必须从基类继承才能具有相同的接口。还是我错了?
-
您的应用程序是否真的内存不足?许多应用程序无需担心为此进行优化。
标签: c# design-patterns inheritance polymorphism decorator