2011-10-18 2 views
0

Existe-t-il un nom officiel pour ce que j'ai décrit ci-dessous. L'exemple est en C#, mais la prémisse s'appliquerait aux autres langs. Je suis presque certain d'avoir fait quelque chose comme ça il y a quelques années dans d'autres langues, mais quel nom, ou le nom du concept m'échappe. Envoi dynamique (de toutes sortes) ??Liaison à la méthode d'exécution

Le point clé que j'essaie de transmettre est que lors de l'exécution, la méthode à exécuter est déterminée et appelée. Les méthodes auraient presque la même signature, ne différant que par le type de l'argument, et que les arguments sont tous dans le même arbre d'héritage. Je sais qu'il y a quelques détails que j'ai laissés de côté, mais je veux garder l'exemple simple.

string result; 
User u; 
User user = new User(); 
Manager manager = new Manager(); 

u = user; 
result = _Print(u); 
Console.WriteLine(result); // user... 

u = manager; 
result = _Print(u); 
Console.WriteLine(result); // manager... 

// interested in part 
private static string _Print(User u) 
{ 
    return (u is Manager) ? Print((Manager)u) : Print(u); 
} 

// plumbing 
private static string Print(User u) 
{ 
    return "User..."; 
} 
private static string Print(Manager m) 
{ 
    return "Manager..."; 
} 

class User { ... } 
class Manager : User { ... } 
+0

N'est-ce pas un anti-modèle? L'utilisateur ne devrait-il pas être responsable de fournir les données d'impression? –

+0

c'est seulement comme ça pour le cas de l'exemple. la charge utile de chaque méthode est seulement là pour fournir le contexte. – jasper

Répondre

1

Il est dynamic dispatch. Je l'apprends en tant que liaison dynamique, car il s'agit d'une fonctionnalité de liaison de fonction fournie par de nombreux langages OO tels que Java, qui l'implémente par défaut, et C++, dans lequel il requiert dans le mot clé explicite "dynamic fashion - Par défaut, C++ est une liaison statique. Cependant, moderne dans OO la liaison dynamique est facilement réalisée par Polimorphism et Overloading. Donc, vous pouvez avoir quelque chose comme:

User u = new User(); 
Console.WriteLine(u.print()); // user... 

u = new Manager(); 
Console.WriteLine(u.print()); // manager... 


class User { ... 
    public string print(User u) 
    { 
     return "User..."; 
    } 
... } 
class Manager : User { ... 
    public string print(Manager m) 
    { 
     return "Manager..."; 
    } 

... } 

Mais vous devez vous adapter à votre langue. Je ne connais pas grand chose à C# et il y a tellement d'idiosyncrasies. J'ai trouvé ce poste avec quelques exemples pour vous - http://www.codeproject.com/KB/cs/dynamicbindingincsharp.aspx

+0

oui, je connais le polymorphisme, mais mon exemple est différent, car c'est où le langage choisira la méthode basée sur le type de l'argument, à l'exécution. en regardant cet article sur wikipedia sur la répartition dynamique, (la section C++), il parle de la surcharge, ce qui n'est pas ce qui est ci-dessus. Il a aussi à dire dans l'article d'envoi dynamique "Exprimé en pseudo-code, le gestionnaire de code.handle (y) pourrait appeler différentes implémentations en fonction du type d'objet y. est-ce correct? – jasper

+0

oui, vous pouvez faire une répartition multiple, mais c'est quelque chose de différent que de surcharger. votre code a l'air de surcharger. ce que vous dites me rappelle le modèle de stratégie - http://en.wikipedia.org/wiki/Strategy_pattern - vous pouvez changer l'algorithme pour gérer quelque chose à l'exécution (il peut être basé sur un type de paramètre, un drapeau, ou autre chose). – darlinton

Questions connexes