抽象类中“公共”构造函数的相关性

问题描述 投票:0回答:4

抽象类中的

public
构造函数有什么相关性吗? 我想不出任何可能的方法来使用它,在这种情况下,编译器不应该将其视为错误(C#,不确定其他语言是否允许)。

示例代码:

internal abstract class Vehicle
{
    public Vehicle()
    {            
    }
}

C# 编译器允许编译此代码,但我无法从外部调用此构造函数。它只能从派生类调用。

那么它不应该只允许

protected
private
修饰符吗?

c# .net constructor abstract-class
4个回答
7
投票

抽象类没有必要使用公共构造函数。我认为编译器不抱怨的原因很简单,他们只是没有花时间讨论这一点,因为它是公共的还是受保护的并不重要。


3
投票

在抽象类内部,对于实例构造函数,修饰符

public
protected internal
protected
都是等效的。那么
internal
比他们更严格,
private
是最严格的准入。

如果所有实例构造函数都是

private
,则只有嵌套在相关类中的类才能继承它。

注意:如果没有为非静态类提供实例构造函数,则编译器将自行生成一个实例构造函数。这是一个带有零参数的构造函数。如果类是抽象类,则自动生成的构造函数是

protected
。否则就是
public

我能想到的唯一情况是,抽象类的实例构造函数是

public
protected
会产生影响,那就是当你使用反射时。举个例子,说

ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors();
如果唯一的构造函数是

protected

,则 
将给出一个空数组;如果是
public
,则将给出一个长度为 1 的数组。但是当然,有一些重载指定了
BindingFlags
,所以这不是问题,只是使用反射时要记住的事情。


1
投票

Dupe:还有另一个问题,就像这样:抽象类构造函数访问修饰符

这个问题的答案最终归结为同一件事:声明它

protected
public
并不重要。

文献中似乎也有一些关于它的讨论(例如在框架设计指南中)。这篇博文中引用了这一点:抽象类的好设计还是坏设计?


1
投票

是的,抽象类上的

public
ctor 是没有意义的,而且有点误导,因为它会表现得受保护,因为只有派生类可以调用它。

一个

private
ctor 在有趣的边缘情况之外将没有任何意义。 如果派生类需要,

protected

ctor 就有意义。

    

© www.soinside.com 2019 - 2024. All rights reserved.