在C#中实现可继承的Style对象

时间:2010-09-02 20:12:59

标签: c# inheritance

在我们的数据层中,我们需要创建可以从其他“样式”对象继承其值的“样式”对象。

示例方案1:

class Style
{
   string Name;
   string ParentName;
   // Other properties go here.
}

因此,当有这样的样式列表时,带有父名称的样式应该从它的父继承它的样式值。

情景2:

class ConatiningType
{
    Style BaseStyle;
    Style MouseHoverStyle;
}

在上面的例子中, MouseHoverStyle应该从BaseStyle 继承它的值。

我确信这种情况有一些推荐的设计模式。如果是这样,请指出那些。

1 个答案:

答案 0 :(得分:1)

也许Style本身应该有ParentStyle

class Style
{
   private readonly Style parentStyle;

   private string name;

   public string Name
   {
       get { return name ?? (parentStyle == null ? null : parentStyle.Name); }
       set { name = value; }
   }

   public Style(Style parentStyle)
   {
       this.parentStyle = parentStyle;
   }
}

必须对parentStyle使用空检查有点烦人,不可否认:(你可以构建一个这样的“默认”版本,当然:

class Style
{
   private static readonly Style DefaultStyle = new Style(null) {
       Name = "",
       ... 
   };

   private readonly Style parentStyle;

   private string name;

   public string Name
   {
       get { return name ?? parentStyle.Name); }
       set { name = value; }
   }

   public Style(Style parentStyle)
   {
       this.parentStyle = parentStyle ?? DefaultStyle;
   }
}

请注意,DefaultStyle 仍然 为空parentStyle(因为DefaultStyle在构造期间为空)但是如果你给它实际的默认值(“”,0等)然后它永远不会试图推迟到它自己不存在的父母身上。