2017-08-02 35 views
0

我找不到在C#中不允许从基类继承私有无参数构造函数的原因。以下是最简单的示例:为什么从具有私有构造函数的类继承是不允许的

public class Base 
    { 
    private Base() 
    { 
    } 

    public string Name { get; set; } 
} 

public class Derived : Base 
{ 
    public Derived(string name) 
    { 
    base.Name = name; 
    } 
} 

编译器不会编译此代码。为什么这样?这个类当然不是密封的,虽然基类不需要多次实例化(就像在Singleton中一样),但我认为派生类有很多次都可以用参数化构造函数实例化。 在这种情况下为什么不允许继承?

+0

从外部看来,基类没有构造函数,如果它们在同一个项目中我敢打赌内部函数:) – EpicKip

+0

只要你从一个类继承,这个类需要有可访问的构造函数。但是你只放了一个私人的类,所以你的Derived类将无法声明它的基类。将您的无参数构造函数设置为受保护,以允许您的Derived类使用它。 – JBO

+0

另请参阅[文档](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private),它清楚地解释了“private”的含义。即该成员只能通过声明的类型访问。派生类不能访问基类的_any_“private”成员,包括构造函数。请注意,这并不意味着'private'构造函数不能被调用(它可以被非私有构造函数调用),也不意味着该类不能被继承(它也可以提供非私有构造函数)。 –

回答

3

因为您需要一个构造函数来实例化一个类,并且构造函数由您想要派生的类保持私有。除了课程本身,没有人可以访问它。对于所有它知道它不存在! (例如,您可能想要为单例模式使用私有构造函数)

如果要允许继承,但不让构造函数从外部调用,则需要使用protected关键字。

0

如果使用private修饰符,则无法访问另一个类中的某些内容;甚至来自派生类。

看一看这样的:Access Modifiers

私人

的类型或成员只能由相同的类或 结构代码访问。

而且因为Base构造的时候了Derived一个实例将被创建,你不能在你的情况下使用private被调用。您应该改用protected

相关问题