抽象类的受保护与公共构造函数?有区别吗?

Posted

技术标签:

【中文标题】抽象类的受保护与公共构造函数?有区别吗?【英文标题】: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()
    
    

谢谢。

【问题讨论】:

【参考方案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】:

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

【讨论】:

以上是关于抽象类的受保护与公共构造函数?有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

抽象类的 C++ 保护构造函数

创建类的受保护构造函数有啥好处和坏处

在 C# 中调用类的受保护构造函数

为啥抽象类的构造函数应该受到保护,而不是公开的?

在类的构造函数上使用受保护的访问修饰符

C++:为啥我的 DerivedClass 的构造函数无法访问 BaseClass 的受保护字段?