我有这个基类有以下接口:

abstract class Base
{
  abstract public object Val
  {
    get;
  }
}

对于任何派生类, 必须在创建对象时指定Val的值。
问题是:如何使派生类执行此操作(希望在编译时)?
我尝试添加一个构造函数:

abstract class Base
{
  public Base(object value)
  {
    val = value;
  }

  private object val;

  ...
}

但正如你所看到的那样,我必须声明一个私有字段来存储它的值(因为Value是只读的)。
问题出现是因为我想使用GoF设计模式中引入的Decorator / Wrapper模式为派生类添加某种效果。 但是因为我在Base类中声明了该字段,所以装饰器会保存相同数据的副本,最终浪费内存。

===============>>#1 票数:2

如果是装饰者,那么就没有字段:

public override object Val {
    // add any decoration effects here if needed
    get { return tail.Val; }
}

tail是你正在装饰的东西。


但是,听起来你的意思是继承(不是装饰) - 如果是这样的话:

abstract class BaseClass {
    protected BaseClass(object val) {...}
}
class ConcreteType : BaseClass {
    public ConcreteType(object val)
        : base(val) { }
}

这里的基类甚至可以处理存储等。

===============>>#2 票数:2 已采纳

试试这个:

abstract class Base 
{
    public Base(object val)
    {
        this.Val = val;
    }

    public object Val { get; private set; }
}

这样,派生类不需要自己的字段:

public class Derived : Base
{
    public Derived(object val) : base(val) { }
}

  ask by atoMerz translate from so

未解决问题?本站智能推荐:

3回复

使用装饰器模式有条件地替换行为而不是扩展

最初我有这个结构: 我被告知这不是一个非常干净的设计,并使用装饰图案重新设计它。 客户端不应该知道两个备份机制,而只是调用备份,然后第一个机制应该尝试备份文件,如果失败则使用机制2.但是我不明白如何使用装饰器模式,因为从我的理解它扩展了功能,但没有取代功能 - 这就是我想要的.....
3回复

装饰模式实现

尝试使用“Head First Design Patterns”一书(用Java编写)中的代码在C#中实现装饰器模式。 我刚刚开始使用C#,因此我仍然对语法不熟悉,所以我不确定为什么我不能让下面的注释代码行工作。 这是Decorator模式中的第一个抽象基类及其派生类: 有问
4回复

装饰器模式与继承的例子

我一直在尝试使用装饰器模式来扩展你不想触摸的代码的功能,我看到了如何实现它但是我现在不确定你为什么不继承原始类并扩展那种方式。 我已经读过装饰器模式允许您在运行时添加功能,而继承意味着它在编译时。 我不明白这一点。 有人可以解释一下,提供示例并解释何时使用装饰器与继承更好。
6回复

多态地应用装饰器模式并在C ++中耦合问题

我正在尝试制作卡尔卡松棋盘游戏的C ++实现。 我正在尝试制作一个具有四个边和三个基本地形之一(田地,道路,城市)的瓷砖对象。 我能想到的最好的瓷砖创建界面是: Tile类的定义如下...... 我希望构造函数初始化从基类Side继承的每个特定Side(TopSide,R
2回复

装饰员模式混乱

我有一个问题,弄清楚我是否正确使用装饰模式。 我们假设我正在使用控制台应用程序。 在这个应用程序中,我定义了一个简单的IConfigPathProvider接口,它将为某个类提供配置文件路径。 该路径存储在控制台应用程序的app.config文件的appSettings部分中。
1回复

装饰器模式,装饰包含不同方法的子类

假设我有一个Animal抽象类和三个扩展Animal类的Dog , Cat和Bear类。 Animal类有抽象方法getDescription 。 Dog类有一个方法getNumberOfHomeworksEaten ,但Cat和Bear没有。 假设我有一个装饰器YellowStripes
3回复

使用装饰器模式时如何保留接口?

如果要装饰的对象实现其他接口的不同组合,那么如何实现装饰器而不丢失额外的接口方法? 例如,假设我们具有以下类和接口,其中I是我们关心的装饰类,D是装饰器的实现: 一旦我们用包装的I(可能是C1,C2或C3)实例化了D的实例,就无法访​​问包装的I可能实现的I1,I2,I3和I4的其他方
1回复

装饰器模式,子类通过其他子类运行以获得行为?

我一直在研究Decorator模式,并且我对理论很了解,但是其中只有一点技术方面的知识我无法理解。 我知道您可以添加装饰器,以便在调用对象时,它也调用所有装饰器函数,以便它们可以更改行为(例如向咖啡中添加配料)。 我不明白的是怎么可能。 通过使用装饰器类(牛奶,鞭子和洒水),这会
2回复

我们可以将装饰对象的实例设为私有,而不是在抽象装饰器中进行保护吗?

我注意到,大多数示例对正在装饰的实例使用受保护的实例。 我也可以使用私人吗?
2回复

C ++ Decorator模式

我有一个向量和几个类(位于不同的文件中)来修改它。 我希望对std::vector进行全局访问,但只有在每个调用存储前一个结果时才会在派生类中访问,最后一个对象应该返回总结果 你能解释如何使用带有std::vector Decorator模式构建一个高性能的接口吗? 我可能错了,可