【问题标题】:Why inheritance from a class with private constructor is disallowed [duplicate]为什么不允许从具有私有构造函数的类继承[重复]
【发布时间】:2017-08-02 08:05:42
【问题描述】:

我找不到在 C# 中不允许从基类继承私有无参数构造函数的原因。这是最简单的例子:

public class Base
  {
   private Base()
   {
   }

  public string Name { get; set; }
 }

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

编译器不编译此代码。为什么会这样?当然,该类不是密封的,虽然基类不应该被多次实例化(如在 Singleton 中),但我认为派生类完全有权使用带参数的构造函数多次实例化。 为什么在这种情况下不允许继承?

【问题讨论】:

  • 在我看来,基类没有构造函数,如果它们在同一个项目中,我敢打赌内部会工作:)
  • 只要继承自一个类,这个类就需要有一个可访问的构造函数。但是您只放置了一个私有的,因此您的 Derived 类将无法指定它的基类。将您的无参数构造函数设置为受保护,以允许您的派生类使用它。
  • 另见the documentation,它清楚地解释了private 的含义。 IE。该成员只能由其声明的类型访问。派生类无权访问基类的 any private 成员,包括构造函数。请注意,这并不意味着不能调用 private 构造函数(可以由非私有构造函数调用),也不意味着不能继承类(它也可以提供非私有构造函数)。

标签: c#


【解决方案1】:

因为你需要一个构造函数来实例化一个类,而构造函数是你想要派生的类私有的。除了类本身之外,没有人可以访问它。它只知道它不存在! (例如,您可能希望对 Singleton 模式使用私有构造函数)

如果你想允许继承,但不让构造函数被外部​​调用,你需要protected关键字。

【讨论】:

    【解决方案2】:

    如果使用private 修饰符,您将无法从其他类访问某些内容;甚至来自派生类。

    看看这个:Access Modifiers

    私人

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

    因为Base 的构造函数必须在创建Derived 的实例时被调用,所以你不能在你的情况下使用private。你应该改用protected

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2011-09-12
      • 1970-01-01
      • 2019-08-27
      • 2011-10-30
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多