【问题标题】:Extend No-Constructor class扩展无构造函数类
【发布时间】:2008-10-20 19:41:33
【问题描述】:

在 C# 中,是否可以扩展没有构造函数的类?

也许我想错了,只是需要在胯部踢一脚。我有一个扩展 System.Windows.Media.Transform 的 Silverlight 类,随着 Silverlight 2 的正式发布,Transform 现在没有构造函数。因此,当我编译我的类时,我收到一条错误消息,提示“类型 '...Transform' 没有定义构造函数。”

还有可能以有用的方式扩展这个类吗?如果没有,我会画很多悲伤的脸。

【问题讨论】:

    标签: c# .net silverlight oop


    【解决方案1】:

    Transform 的唯一构造函数是内部的,因此您不能自己从中派生。

    【讨论】:

    • :( 看到了吗?这是一个开始。
    • WTF?他们为什么不直接密封它,像对图形和其他相关课程那样破坏它?
    • 因为他们需要在自己的程序集中从中派生。这并不少见。
    • 是的,确实没有什么问题。我想我已经吸取了关于开发 Beta 版东西的教训。
    【解决方案2】:

    隐藏所有公共构造函数是一种用于防止子类化并强制开发人员按预期使用类的技术。可能是实现者希望您在扩展时使用 Adapter 或 Facade 甚至是 Proxy。

    构造函数中可能存在重要的生命周期细节,需要按照原始实现者的意图使用,或者可能是开发人员的疏忽。

    我见过尝试转换为工厂模式的尝试,这种模式以防止子类化的方式完成。 IE。没有可用于子类的受保护构造函数。有时,高级对象模式会影响语言的内置功能。

    【讨论】:

      【解决方案3】:

      某个类不可能没有构造函数。每个班级至少有一个 AFAIK。如果您不编写它,C# 编译器将为您插入一个默认(无参数)构造函数。

      【讨论】:

      • 但默认构造函数不需要公开。如果它是私有的,除了类本身没有人可以访问它,如果它是内部的,至少没有外部代码可以访问它。
      • 从 C# 2 开始,编写没有构造函数的类并非不可能:静态类没有构造函数。
      • (此外,在 IL 中总是可以做到的。)
      【解决方案4】:

      只要它没有密封,你应该可以扩展它。

      【讨论】:

      • 不是真的,即使在同一个程序集中 - 如果它只有私有构造函数(并且你不能将新类型嵌入为嵌套类型),你就完蛋了。基本上 C# 编译器会强制你调用一个基本构造函数,所以你必须能够访问一个......
      • 你是对的。如果该类显式定义了私有构造函数,则编译器不会生成默认构造函数。但我正在考虑“没有构造函数”——这意味着类的创建者没有编写构造函数。这意味着编译器将生成一个默认构造函数。
      • 如果它是一个静态类就不行——它们真的没有构造函数:)
      猜你喜欢
      • 1970-01-01
      • 2013-11-15
      • 2019-01-07
      • 2021-02-13
      • 2018-08-24
      • 2014-05-29
      • 2013-05-29
      • 2022-11-24
      • 2012-01-09
      相关资源
      最近更新 更多