una tipos que programacion objetos metodos instancias instanciar heredada declaracion constructores clases clase c# inheritance constructor sealed

c# - tipos - que es public en programacion



¿Cuál es la diferencia entre una clase que tiene un constructor privado y una clase sellada que tiene un constructor privado? (6)

¿Hay alguna diferencia entre A y B?

La clase A tiene un constructor privado:

class A { private A() { } }

La clase B está sellada y tiene un constructor privado:

sealed class B { private B() { } }


Hay una pequeña diferencia que puede obtener, para hacer con Code Analysis.

Considera este código:

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(); } }

Hay una advertencia de Análisis de código para el constructor Derivado, porque estamos accediendo a un método virtual desde allí, que es A Bad Thing.

Sin embargo, si hace Derived sellado, la advertencia de Análisis de código desaparece.

Entonces hay una pequeña e inventada diferencia para ti. ;)


A puede ser heredado por una clase anidada, mientras que B no se puede heredar en absoluto. Esto es perfectamente legal:

public class A { private A() { } public class Derived : A { } }

Tenga en cuenta que cualquier código podría crear un new A.Derived() o heredar de A.Derived (su constructor es público), pero ninguna otra clase fuera del texto fuente de A puede heredar directamente de A

Un uso típico para algo como esto es una clase con valores tipo enum pero que puede tener un comportamiento personalizado:

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(); }


Según el segundo artículo, si este es el único constructor, no podrá crear una instancia de Clase A o Clase B. Debido a que la Clase A tiene un constructor privado que no puede derivar de ella debido a su nivel de protección, ni puede derivar de B con sellado.

Herencia (Guía de programación C #)

Acceso de clase derivada a miembros de clase base Una clase derivada tiene acceso a los miembros internos públicos, protegidos, internos y protegidos de una clase base. Aunque una clase derivada hereda los miembros privados de una clase base, no puede acceder a esos miembros. Sin embargo, todos los miembros privados todavía están presentes en la clase derivada y pueden hacer el mismo trabajo que harían en la clase base misma. Por ejemplo, supongamos que un método de clase base protegida accede a un campo privado. Ese campo debe estar presente en la clase derivada para que el método de clase base heredado funcione correctamente.

Constructores privados (Guía de programación C #)

Un constructor privado es un constructor de instancia especial. Se usa comúnmente en clases que solo contienen miembros estáticos. Si una clase tiene uno o más constructores privados y ningún constructor público, entonces otras clases (excepto las clases anidadas) no pueden crear instancias de esta clase.


Si una clase está sellada, no será posible definir una clase que se deriva de ella. Una clase con un constructor privado puede ser instanciada por métodos de fábrica dentro de la clase, ni heredada por clases anidadas (que, dependiendo de su nivel de acceso y constructores, pueden ser heredables por código externo). Además, el código externo arbitrario puede declarar clases que se derivan de él y satisfacen una new() restricción new() . Si la clase derivada no puede llamar a un constructor base, sus propios constructores no tendrían otra alternativa que arrojar una excepción, bloquearse o bloquearse, pero dicho comportamiento no sería detectable hasta que se haya intentado construir una instancia; el código compilaría bien


Una clase sealed se puede instanciar pero una clase con un constructor privado no puede. Ambos no permiten la herencia, pero ese no es el objetivo de un constructor privado.

La razón por la que utilizas un constructor privado es para detener la creación de instancias. Esto se usa a menudo en métodos de fábrica estáticos, donde debe llamar a MyClass::Create(...) para crear una instancia.

Esto no tiene nada que ver con el sellado, que detiene la herencia. Si usa un constructor privado para detener la herencia, entonces está utilizando el enfoque equivocado. Hay maneras de moverse por un constructor privado para la herencia.


public class Test { private Test() { Debug.WriteLine("private constructor has been called in class Test"); } public virtual string Run() { return "Test.Run"; } public static Test GetTestRequest() { return new Test(); } public static DerivedTest GetDerivedTestRequest() { return new DerivedTest(); } public class DerivedTest:Test { public DerivedTest() { Debug.WriteLine("public constructor has been called in derived class DerivedTest."); } public override string Run() { return "DerivedTest.Run"; } } }

Debug.WriteLine (Test.GetTestRequest (). Ejecutar ()); Debug.WriteLine (Test.GetDerivedTestRequest (). Ejecutar ());

=============================================== ========== Salida:

Se ha llamado al constructor privado en la clase Test Test.Run

Se ha llamado al constructor privado en clase. Se ha llamado al constructor público de prueba en la clase derivada DerivedTest. DerivedTest.Run

Entonces, una clase anidada puede derivarse de una clase base externa que tiene el único constructor privado.