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类或B类的实例.因为A类有一个私有构造函数,由于它的保护级别而无法从中派生,也不能从中派生出来B带密封.
对基类成员的派生类访问派生类可以访问基类的public,protected,internal和protected内部成员.即使派生类继承了基类的私有成员,它也无法访问这些成员.但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作.例如,假设受保护的基类方法访问私有字段.该字段必须存在于派生类中,才能使继承的基类方法正常工作.
私有构造函数是一个特殊的实例构造函数.它通常用于仅包含静态成员的类中.如果一个类有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(嵌套类除外)创建此类的实例.
与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密封,代码分析警告就会消失.
所以对你来说有一个微不足道的设计差异.;)