具有私有构造函数的类和具有私有构造函数的密封类之间有什么区别?

jan*_*y02 29 c# inheritance constructor sealed

A和B之间有什么区别吗?

A类有私有构造函数:

class A
{
    private A()
    { }
}
Run Code Online (Sandbox Code Playgroud)

B类是密封的,有一个私有构造函数:

sealed class B
{
    private B()
    { }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ray 41

A可以由嵌套类继承,而B根本不能继承.这是完全合法的:

public class A {
  private A() { }

  public class Derived : A { }
}
Run Code Online (Sandbox Code Playgroud)

请注意,任何代码都可以创建new A.Derived()或继承A.Derived(其构造函数是public),但源文本之外的其他类都A不能直接从中继承A.

像这样的类的典型用法是具有类似枚举值的类,但它可以具有自定义行为:

public abstract class A {
  private A() { }

  public abstract void DoSomething();

  private class OneImpl : A { 
    public override void DoSomething() { Console.WriteLine("One"); }
  }

  private class TwoImpl : A { 
    public override void DoSomething() { Console.WriteLine("Two"); }
  }

  public static readonly A One = new OneImpl();
  public static readonly A Two = new TwoImpl();
}
Run Code Online (Sandbox Code Playgroud)

  • 基本上,这与在A上提供其他构造函数的情况相同,除了这些是超级"花哨"嵌套类的构造函数 (2认同)

Har*_*son 5

基于第二篇文章,如果这是唯一的构造函数,您将无法创建A类或B类的实例.因为A类有一个私有构造函数,由于它的保护级别而无法从中派生,也不能从中派生出来B带密封.

继承(C#编程指南)

对基类成员的派生类访问派生类可以访问基类的public,protected,internal和protected内部成员.即使派生类继承了基类的私有成员,它也无法访问这些成员.但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作.例如,假设受保护的基类方法访问私有字段.该字段必须存在于派生类中,才能使继承的基类方法正常工作.

私有构造函数(C#编程指南)

私有构造函数是一个特殊的实例构造函数.它通常用于仅包含静态成员的类中.如果一个类有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(嵌套类除外)创建此类的实例.


Mat*_*son 5

与Code Analysis相比,您可以获得一个微小的差异.

考虑以下代码:

public class Base
{
    public virtual void Function()
    {
    }
}

public class Derived: Base
{
    public static  Derived Create()
    {
        return new Derived();
    }

    private Derived()
    {
        // Code analysis warning: CS2214 "Do not call overridable methods in constructors".
        Function(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

Derived构造函数有一个Code Analysis警告,因为我们正在从它访问一个虚拟方法,这是一件糟糕的事情.

但是,如果Derived密封,代码分析警告就会消失.

所以对你来说有一个微不足道的设计差异.;)