2010-10-01 14 views
7


Qual è la differenza tra il polimorfismo di runtime e il polimorfismo in fase di compilazione? Inoltre, qual è la differenza tra l'associazione anticipata e l'associazione tardiva? Gli esempi sarebbero molto apprezzati.C# Polymorphism

+7

È necessario chiedere * una * domanda. Questi termini non hanno nulla in comune. –

+3

Vuoi esempi per migliorare Google? –

+6

Questo dovrebbe essere etichettato come 'compito a casa '? – keyboardP

risposta

31

tempo di compilazione polimorfismo

overloading dei metodi è un grande esempio. Puoi avere due metodi con lo stesso nome ma con diverse firme. Il compilatore sceglierà la versione corretta da utilizzare in fase di compilazione.

Run-Time polimorfismo

override un metodo virtuale da una classe genitore in una classe figlia è un buon esempio. Un altro è una classe che implementa metodi da un'interfaccia. Questo ti permette di usare il tipo più generico nel codice mentre usi l'implementazione specificata dal bambino. Date le seguenti definizioni di classe:

public class Parent 
{ 
    public virtual void SayHello() { Console.WriteLine("Hello World!"); } 
} 

public class Child : Parent 
{ 
    public override void SayHello() { Console.WriteLine("Goodbye World!"); } 
} 

Il seguente codice di uscita "Goodbye World!":

Parent instance = new Child(); 
instance.SayHello(); 

associazione anticipata

Specificando il tipo in fase di compilazione:

SqlConnection conn = new SqlConnection(); 

Late Bind ing

Il tipo è determinato in fase di esecuzione:

object conn = Activator.CreateInstance("System.Data.SqlClient.SqlConnection"); 
+1

come si inserisce .Net Generics nella foto qui? In C++, i modelli esprimono il polimorfismo in fase di compilazione. thx –

3

UPDATE: Si prega di vedere i commenti di Eric Lippert a questa risposta.

In C# 2 tutti i collegamenti sono precoci, poiché C# 2 è un linguaggio tipizzato staticamente. Un linguaggio di binding tardivo sarebbe quello in cui avviene l'associazione del metodo in fase di esecuzione. (C# 4 include una funzionalità di associazione tardiva con l'introduzione di dynamic.)

Non sono sicuro di cosa si intenda per tempo di esecuzione rispetto al polimorfismo del tempo di compilazione.

Il compilatore C# determinerà in fase di compilazione quale metodo verrà chiamato il sovraccarico. Il tipo di esecuzione di un'istanza determinerà quale implementazione di un particolare overload di metodo verrà eseguita. Questo è ancora considerato l'associazione anticipata anche se accade in fase di esecuzione, perché il metodo selezionato è vincolato ad essere un'implementazione di uno specifico overload di metodo virtuale e non è possibile che tale chiamata generi un'eccezione relativa al tipo, ad esempio si verificano con un linguaggio dinamico e un'associazione tardiva.

+0

C# 2 supporta l'associazione tardiva a livello di lingua sotto forma di * dispacciamento virtuale *. Nei linguaggi di dispatch virtuali la chiamata al metodo è * late bound * perché il * metodo esatto * chiamato non è determinato fino a * runtime *. La * firma * del metodo è determinata al momento della compilazione ma il * metodo effettivamente chiamato * non lo è. C# 4 supporta l'associazione tardiva dinamica: può determinare * tutto * sul metodo (tranne il suo nome) in fase di esecuzione. –

+0

Oggetto: il tuo aggiornamento: le opinioni variano. Alcune persone considerano il dispatch virtuale come un binding tardivo poiché il metodo chiamato viene determinato in fase di runtime. (Questi tendono ad essere persone con uno sfondo in C o qualche altro linguaggio di rilegatura prevalentemente statico.) Alcune persone considerano il binding anticipato perché lo * slot * che conterrà il puntatore del metodo viene determinato al momento della compilazione. (Questi tendono ad essere persone che sono abituate alla programmazione COM o C++ dove quasi ogni chiamata è virtuale.) Personalmente cerco di usare solo "late binding" per significare "dynamic". –

+0

@Eric Lippert - OK, ha senso. Il tuo uso di "late binding" sembra simile al mio allora. Ho sempre pensato "presto" e "tardi" per indicare, in effetti, il momento in cui l'errore viene rilevato quando qualcosa va storto. Grazie per i tuoi commenti! –

3

Una risposta molto semplice e diretta per la differenza tra il tempo di compilazione e il polimorfismo del tempo di esecuzione.

Compilare tempo polimorfismo - Sovraccarico metodo (con lo stesso nome metodo ma con firma diversa).Si prega di controllare il video sul metodo di sovraccarico al seguente URL http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

Run Time polimorfismo - l'override dei metodi (Invocare i metodi classe figlia sovrascritto ad fase di esecuzione, utilizzando una variabile di riferimento classe di base si chiama come il polimorfismo runtime). Si prega di controllare i video su metodo overriding (polimorfismo) a questo URL http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html