2010-10-01 7 views
7


Quelle est la différence entre le polymorphisme d'exécution et le polymorphisme de compilation? Aussi, quelle est la différence entre la liaison précoce et la liaison tardive? Des exemples seraient très appréciés.Polymorphisme C#

+7

Vous devez poser * une * question. Ces termes n'ont rien en commun. –

+3

Vous voulez des exemples pour google mieux? –

+6

Est-ce que cela devrait être étiqueté comme «devoirs»? – keyboardP

Répondre

31

Compile temps Polymorphisme

méthode surchargeant est un excellent exemple. Vous pouvez avoir deux méthodes avec le même nom mais avec des signatures différentes. Le compilateur choisira la version correcte à utiliser lors de la compilation.

Run-Time Polymorphisme

Surcharger une méthode virtuelle à partir d'une classe parente dans une classe d'enfants est un bon exemple. Un autre est une classe implémentant des méthodes à partir d'une interface. Cela vous permet d'utiliser le type plus générique dans le code tout en utilisant l'implémentation spécifiée par l'enfant. Étant donné les définitions de classe suivantes:

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

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

Le code suivant sortie "Au revoir le monde!":

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

liaison anticipée

Spécification du type à la compilation:

SqlConnection conn = new SqlConnection(); 

Reliure en retard ing

Le type est déterminé lors de l'exécution:

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

Comment les génériques .Net s'intègrent-ils dans l'image ici? En C++, les templates expriment le polymorphisme de compilation. th # –

3

MISE À JOUR: S'il vous plaît voir les commentaires de Eric Lippert à cette réponse. Dans C# 2, toute liaison est précoce, car C# 2 est un langage typé statiquement. Un langage de liaison tardif serait celui dans lequel la liaison de méthode se produit au moment de l'exécution. (C# 4 comprend une fonction de liaison tardive avec l'introduction de dynamic.)

Je ne suis pas sûr de ce que vous voulez dire par polymorphisme de temps de compilation vs.

Le compilateur C# déterminera au moment de la compilation quelle surcharge de méthode sera appelée. Le type d'exécution d'une instance déterminera quelle implémentation d'une surcharge de méthode particulière sera exécutée. Cela est toujours considéré comme une liaison anticipée, même si cela se produit au moment de l'exécution, car la méthode sélectionnée est contrainte à être une implémentation d'une surcharge de méthode virtuelle spécifique et il n'est pas possible qu'un tel appel génère une exception liée au type. se produire avec un langage dynamique et une liaison tardive.

+0

C# 2 prend en charge la liaison tardive au niveau du langage sous la forme de * envoi virtuel *. Dans les langages de répartition virtuels, l'appel de méthode est * late bound * car la * méthode exacte * appelée n'est pas déterminée avant * runtime *. La * signature * de la méthode est déterminée au moment de la compilation mais la méthode * effectivement appelée * ne l'est pas. C# 4 supporte la liaison tardive dynamique: elle peut déterminer * tout * sur la méthode (sauf son nom) au moment de l'exécution. –

+0

Re: votre mise à jour: Les opinions varient. Certaines personnes considèrent l'envoi virtuel comme une liaison tardive car la méthode appelée est déterminée au moment de l'exécution. (Ceux-ci ont tendance à être des personnes avec un arrière-plan en C ou un autre langage de liaison principalement statique.) Certaines personnes considèrent qu'il s'agit d'une liaison anticipée car le * slot * qui contiendra le pointeur de la méthode est déterminé au moment de la compilation. (Ceux-ci ont tendance à être des gens qui sont habitués à la programmation COM ou C++ où presque tous les appels sont virtuels.) Personnellement, j'essaie de n'utiliser que la "liaison tardive" pour signifier "dynamique". –

+0

@Eric Lippert - OK, ça a du sens. Votre utilisation de "liaison tardive" semble similaire à la mienne alors. J'ai toujours pensé "début" et "tard" pour indiquer, en effet, l'heure à laquelle l'erreur est détectée quand quelque chose ne va pas. Merci pour vos commentaires! –

3

Une réponse très simple et directe pour la différence entre le temps de compilation et le polymorphisme d'exécution.

Polymorphisme temporel de la compilation - Surcharge de méthode (ayant le même nom de méthode mais avec une signature différente).S'il vous plaît vérifier la vidéo sur la méthode de surcharge à l'adresse http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

Durée Polymorphisme - méthode redéfinie (Invoquer les méthodes classe enfant surchargées au moment de l'exécution, en utilisant une variable de référence de classe de base est appelé polymorphisme temps d'exécution). S'il vous plaît vérifier les vidéos sur le remplacement de la méthode (Polymorphisme) à cette URL http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html