【问题标题】:Is there a practical alternative to struct inheritance? (C#)结构继承是否有实用的替代方案? (C#)
【发布时间】:2010-04-25 11:05:09
【问题描述】:

我正在编写将填充System.Windows.Documents 命名空间中类的MarginPaddingBorderThickness 属性的代码。这些属性中的每一个都接受System.Windows.Thickness 形式的值,这是一个结构。

但是,我希望将一些附加数据与这些属性分配中的每一个相关联,这些数据随后可能由我的代码检索。如果Thickness 是一个类,我将从它继承并在子类中定义属性来存储我的附加数据项。但是既然是struct,继承是不可能的。

是否有任何实用的方法来实现这一点,同时保持与我正在填充的属性的类型兼容性?

感谢您的想法,

提姆

【问题讨论】:

    标签: c# inheritance struct


    【解决方案1】:

    没有好的替代品。

    根据您要执行的操作,您或许可以使用所需的属性定义自己的类,并定义隐式转换运算符以隐式转换为正确的结构类型。然后,您将能够将您的类传递给所有需要厚度参数的方法。

    但是,这将违背使用隐式转换运算符的建议,因为它声明隐式转换不应丢失任何信息。您将无法从您正在阅读的属性中获取厚度,并查看您附加的额外信息。

    你可以这样实现它:

    public class ThicknessEx
    {
        public string ExtraData { get; set; }
        public Thickness Thickness { get; set; }
    
        public static implicit operator Thickness(ThicknessEx rhs)
        {
            return rhs.Thickness;
        }
    }
    

    但是,将额外的数据存储在其他地方可能会更好。如何做到这一点取决于您的需求和应用程序。

    【讨论】:

    • 感谢您提供非常创新的解决方案。正如您所说,它几乎可以工作,但是由于无法从分配给它的属性中检索额外的数据,这意味着它必须在其他地方复制,这有点弄巧成拙。我尝试通过 SetValue() 方法调整您的想法以使用底层依赖属性,但是 SetValue() 执行类型检查,这似乎是传递除预期类型之外的任何内容的障碍。
    【解决方案2】:

    您也许可以使用 AugmentedThickness 类型的 Attached Dependency Properties,然后在它们更改时更新它们打算更新的基础属性。这需要使用您的附加属性执行所有访问,因为简单地设置厚度属性将不会使用您的 AugmentedThickness。如有必要,您还可以(尽管它可能有点邪恶)监听对厚度属性的显式更改(您没有启动)并将其强制返回到您的 AugmentedThickness 指定的值。

    【讨论】:

      【解决方案3】:

      你不能存储一个字典,其中键是结构的哈希码吗?

      【讨论】:

      • 这取决于两个相等的 Thickness 实例是否需要在额外数据中具有相同的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2013-06-18
      相关资源
      最近更新 更多