【问题标题】:Why has the selector class an internal Constructor?为什么选择器类有一个内部构造函数?
【发布时间】:2011-01-26 12:29:46
【问题描述】:

我尝试从 Selector 类派生,因为我需要与 ListBox 类似的功能,但它不是 ListBox。 我查看了 Selector 类的签名,它是(http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector(v=vs.95).aspx)

public abstract class Selector : ItemsControl, 
ISupportInitialize

但问题是构造函数是内部的。所以不可能从程序集外的这个类派生出来(ListBox和ComboBox在这个程序集中)。

我现在从 ListBox 派生来实现我的目标,但我的问题是:

为什么选择器类有一个内部构造函数?

【问题讨论】:

    标签: silverlight silverlight-4.0 selector


    【解决方案1】:

    因为Selector 类是abstract。您不能创建抽象类的实例,并且确保您甚至不能(以常规方式)错误地做到这一点的最简单方法是不提供构造函数。

    我在 MSDN 上没有看到构造函数的条目,但我敢打赌,它可能是 protected 构造函数,而不是 internal 构造函数。

    但据我所知,没有什么能阻止您从 Selector 派生并创建您的自定义实现。

    编辑: 反射器显示构造函数确实是internal,所以没有派生...

    【讨论】:

    • 您好,这是不可能的。因为如果你想从一个类派生,c'tor 必须是可访问的。示例: public abstract class MyClass { private MyClass(){} } public class MySecondClass : MyClass { }
    • @TerenceJackson:这就是我更新答案的原因(参见“编辑”);)有点奇怪,通常要做的是创建一个受保护的构造函数。我的猜测是设计者明确要求该类不可继承,因此选择将其设为内部而不是受保护。
    • 抱歉评论 ;) 我已经在打字了,但不认识你的编辑。我认为这个类是公开的,但 c'tor 没有受到保护或公开,这很奇怪......
    • @TerenceJackson:答案的第一部分已经涵盖了这一点:让抽象类只实现受保护的构造函数是一种很好的设计实践,以避免以常规方式“更新”实例的可能性。该类(及其后代)本身可能会暴露公共行为,因此需要将其公开。还有更多的类是公共的,没有公共构造函数。设计者最初的意图可能是消除其程序集之外的后代的可能性,因此只剩下添加内部构造函数的选项。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多