【问题标题】:protected vs public constructor for abstract class? Is there a difference?抽象类的受保护与公共构造函数?有区别吗?
【发布时间】:2011-05-30 18:06:36
【问题描述】:

这个问题是出于好奇。有没有区别:

public abstract class MyClass
{
    public MyClass()
    {
    }
}

public abstract class MyClass
{
    protected MyClass()
    {
    }
}

谢谢。

【问题讨论】:

    标签: c# constructor public protected


    【解决方案1】:

    抽象类中不应该有公共构造函数 抽象类型的构造函数只能由派生类型调用。因为公共构造函数创建类型的实例,而您不能创建抽象类型的实例,所以带有公共构造函数的抽象类型设计不正确。

    详情请看这里http://msdn.microsoft.com/en-us/library/ms182126.aspx

    【讨论】:

    • @Shekhar:请不要将 MSDN 链接发布到旧版本。读者点击该文档中的链接将被引导至更多旧版本。
    • @John ohthanx 编辑我的帖子。我忘了在页面上查找版本....:P
    • “设计不正确”与“不能有”完全不同。
    • 这是一篇很晚的帖子,但是如果您使用任何 IOC 或 DI 风格的方法,在抽象类中拥有一个公共构造函数确实在某些情况下是有意义的,您希望尽量减少代码重复。
    • @code4life - 如果你能给出一个例子或发布一个例子的链接,那就太棒了。不以任何方式撕毁您的评论,但我对您的意思很感兴趣。
    【解决方案2】:

    它们在所有实际用途中都是相同的。

    但是由于您要求差异,我能想到的一个差异是,如果您使用反射搜索类的构造函数,那么匹配的 BindingFlags 将会不同。

    BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
    var constructor = typeof(MyClass).GetConstructor(flags, null, new Type[0], null);
    

    这将在一种情况下找到构造函数,但在另一种情况下不会。

    【讨论】:

      【解决方案3】:

      就未来使用这段代码而言,没有区别。

      【讨论】:

        猜你喜欢
        • 2013-08-29
        • 2014-12-23
        • 2011-01-13
        • 2010-11-08
        • 2019-08-24
        • 2011-03-28
        • 2017-12-19
        • 2013-11-13
        • 2016-03-19
        相关资源
        最近更新 更多