抽象类的受保护与公共构造函数?有区别吗?
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】:就未来使用这段代码而言,没有区别。
【讨论】:
以上是关于抽象类的受保护与公共构造函数?有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章