2010-09-06 15 views

Respuesta

23

no, una clase no puede tener un constructor virtual.

No tiene sentido tener un constructor virtual. El orden en que se construyen los objetos en C# es construyendo clases derivadas primero, por lo que siempre se llama al constructor derivado ya que la clase a la que desea llamar es bien conocida en el momento de la construcción.

La otra cosa es que, si en realidad se escribe este código, usted puede ver rápidamente que hace muy poco sentido en absoluto

Si tuviera:

public class BaseClass 
{ 
    public virtual BaseClass() 
    { 
    } 
} 

y luego

public class InheritedClass : BaseClass 
{ 
    //overrides baseclass constructor but why would you do this given that the  
    //constructor is always going to be called anyway?? 
    public override InheritedClass() 
    { 
    } 
} 
+1

En cuanto a llamar al constructor base en la clase derivada: no una cadena a la base como normal, por ejemplo 'anulación pública InheritedClass(): base()'. –

+0

@ paul ruane: está en lo correcto, pero el punto que estaba tratando de plantear es que anular la clase base es redundante porque va a ser explícito al respecto y hacer referencia a él usando base() o no lo está se llamará cuando el objeto se construya de todos modos, por lo que tener un constructor virtual no tiene sentido – lomaxx

+8

Tiene mucho sentido tener constructores virtuales. Esto es lo que logran los diversos patrones de constructor en idiomas que no lo admiten directamente. –

0

Declarar algo virtual significa que puede ser anulado por una subclase de la clase actual. Sin embargo, se llama al constructor cuando se crea una instancia de una clase. En ese momento, no puede crear una subclase de la clase en cuestión, por lo que nunca será necesario declarar un constructor virtual.

5

No directamente, pero el clásico Método de fábrica del patrón Gang of Four logra lo que equivaldría a un tipo de constructor virtual al posponer la creación de instancias en subclases.

2

No, ¿cómo funcionaría? Se debe invocar a todos los constructores de la jerarquía cuando deriva clases hijo de clases base. Hacer un constructor virtual implicaría lo contrario.

Algo que puede describirse como un comportamiento similar al del constructor virtual, es cuando usa el patrón de fábrica. Imagine este escenario:

class AnimalFactory 
{ 
    virtual Animal CreateAnimal(return new Animal("Cow");); 
} 

El comportamiento predeterminado de esta fábrica es crear vacas. Pero si creamos una clase derivada:

class DogFactory : AnimnalFactory 
{ 
    override Animal CreateAnimal(return new Animal("Dog");); 
} 

Ahora estamos creando perros. Por supuesto, este no es un verdadero constructor virtual (lo cual es imposible), esta es una construcción virtual.

1

Si miramos las definiciones de la palabra constructor y virtual, llegamos a la conclusión lógica de que un constructor no puede ser virtual.

+3

¿De verdad? En Delphi, los constructores virtuales son una ocurrencia común para acompañar a los TIPOS DE REFERENCIA DE CLASE ("CLASE DE "). Un concepto del cual los C-programadores no tienen conocimiento :-). Sí, sé que la pregunta dice C#, pero el concepto de constructores virtuales no es una contradicción en términos en todos los idiomas :-). – HeartWare

+0

Tiene razón, sobre los constructores virtuales en Delphi pero, esta consecuencia de la especificación del lenguaje. Usted declara un método y declara que será un constructor. El nombre del método no está relacionado con el tipo que crea lo que siempre. Y esta es la clave para entender por qué generalmente el concepto de constructor virtual no es válido. Puede declarar un método de fábrica e incluso anularlo. Así que se da la vuelta a la cuestión. Delphi tiene un método virtual que puede llamarse constructores pero no tiene estructura de que es un constructor en sí mismo como lo hace otros lenguajes de C. –

11

Un método virtual es por definición un método que se distribuye en base al análisis del tipo de tiempo de ejecución del receptor, no el análisis de tipo estático en tiempo de compilación del receptor.

Un constructor es un método llamado cuando se crea una nueva instancia de un tipo particular.

Dado que el tipo de ejecución de un nuevo objeto creado es siempre la misma (*) como su tipo en tiempo de compilación, no hay necesidad de constructores virtuales: el envío en tiempo de ejecución siempre elegiría el mismo método que el envío estática Entonces, ¿por qué molestarse en hacer una diferencia?

(*) Esto no es del todo cierto; hay escenarios que implican interoperabilidad COM en los que el tipo de tiempo de ejecución de una construcción no es el tipo de tiempo de compilación.Muchas cosas son extrañas en el mundo del código de interconexión heredado.

1

Para su información, cuando la gente está pidiendo constructores virtuales un muy buen modelo para estudiar es InversionOfControl

En .NET tenemos un par de contenedores COI, como ObjectBuilder, Unidad, MEF, Spring.NET. En Java (con riesgo de mostrar mi incompetencia de Java) está Spring, Tapestry y muchos otros.

IMHO IoC es lo que hace que OO cumpla sus promesas.

Cuestiones relacionadas