2010-09-06 10 views

risposta

23

no, una classe non può avere un costruttore virtuale.

Non ha senso avere un costruttore virtuale. L'ordine in cui gli oggetti sono costruiti in C# consiste nel costruire prima le classi derivate, quindi il costruttore derivato viene sempre chiamato poiché la classe che si desidera chiamare è ben nota al momento della costruzione.

L'altra cosa è, se effettivamente digita questo codice fuori, si può vedere rapidamente che rende molto poco senso a tutti

Se trovassi:

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

e poi

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

Per quanto riguarda chiamare il costruttore di base nella classe derivata: non una catena da basare come normale, ad esempio "public override InheritedClass(): base()". –

+0

@paul ruane: sei corretto, ma il punto che stavo cercando di fare è che l'override della classe base è ridondante perché o sarai esplicito su di esso e lo fai riferimento usando base() o non lo sei e verrà chiamato quando l'oggetto è costruito in ogni caso quindi avere un costruttore virtuale è inutile – lomaxx

+8

Ha perfettamente senso avere costruttori virtuali. Questo è ciò che i vari modelli di build realizzano in lingue che non lo supportano direttamente. –

0

Dichiarare qualcosa di virtuale significa che può essere sostituito da una sottoclasse della classe corrente. Tuttavia, il costruttore viene chiamato quando viene creata un'istanza di una classe. A quel tempo non puoi creare una sottoclasse della classe in questione, così non ci sarebbe mai bisogno di dichiarare un costruttore virtuale.

5

Non direttamente, ma il classico metodo Factory modello Gang of Four raggiunge quello che equivarrebbe a un costruttore virtuale di generi, rimandando l'istanziazione alle sottoclassi.

2

No, come funzionerebbe? Tutti i costruttori nella gerarchia devono essere chiamati quando si derivano classi figlio da classi base. Fare un costruttore virtuale implicherebbe altrimenti.

Qualcosa che può essere descritto come un comportamento simile al costruttore virtuale, è quando si utilizza il modello di fabbrica. Immaginate questo scenario:

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

Il comportamento predefinito di questo stabilimento è la creazione di mucche. Ma se creiamo una classe derivata:

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

Ora stiamo creando cani. Naturalmente questo non è un vero costruttore virtuale (che è impossibile), questa è una costruzione virtuale.

1

Se guardiamo alle definizioni della parola costruttore e virtuale, siamo giunti alla conclusione logica che un costruttore non può essere virtuale.

+3

Davvero? In Delphi, i costruttori virtuali sono un evento comune a cui attenersi con CLASS REFRENCE TYPES ("CLASS OF "). Un concetto di cui i programmatori C non hanno conoscenza :-). Sì, so che la domanda dice C#, ma il concetto di costruttori virtuali non è una contraddizione in termini in tutte le lingue :-). – HeartWare

+0

Hai ragione, sui costruttori virtuali in Delphi ma, questa conseguenza dalle specifiche del linguaggio. Si dichiara un metodo e si afferma che questo sarà un costruttore. Il nome del metodo non è correlato al tipo che crea ciò che mai. E questa è la chiave per capire perché generalmente il concetto di costruttore virtuale non è valido. È possibile dichiarare un metodo di fabbrica e persino annullarlo. Quindi la strada è girata Delphi ha un metodo virtuale che può essere chiamato costruttori ma non ha una struttura che è un costruttore da solo come fanno gli altri langauges. –

11

Un metodo virtuale è per definizione un metodo che viene inviato in base all'analisi del tipo di runtime del ricevitore, non all'analisi del tipo statico in fase di compilazione del ricevitore.

Un costruttore è un metodo chiamato quando viene creata una nuova istanza di un particolare tipo.

Dal momento che il tipo di runtime di un oggetto appena creato è sempre lo stesso (*) come il suo tipo in fase di compilazione, non è necessario per i costruttori virtuali: l'invio runtime sceglierebbe sempre lo stesso metodo come l'invio statica , quindi perché preoccuparsi di fare la differenza?

(*) Questo non è completamente vero; ci sono scenari che riguardano l'interoperabilità COM in cui il tipo di runtime di una costruzione non è il tipo in fase di compilazione.Molte cose sono strane nel mondo del codice di interoperabilità legacy.

1

Cordiali saluti quando le persone stanno chiedendo per i costruttori virtuali un ottimo modello di esaminare è InversionOfControl

In .NET abbiamo un paio di contenitori IoC quali ObjectBuilder, Unità, MEF, Spring.NET. In Java (con il rischio di mostrare la mia incompetenza in Java) c'è Spring, Tapestry e molti altri.

IMHO IoC è ciò che rende OO fedele alle sue promesse.

Problemi correlati