2010-05-23 16 views
0

Salut, je m'éduque des principes. Je voudrais savoir si c'est un exemple correct de définition de Cardellis de parametric polymorphism. S'il te plaît, éclaire-moi.
L'exemple est dans la syntaxe basée sur un script de cfml.Est-ce un exemple de polymorphisme paramétrique?

<cfscript> 
Parent = createobject("component","webapp.model.Parent").init(); 
Child = createobject("component","webapp.model.Child").init(); 
GrandChild = createobject("component","webapp.model.GrandChild").init(); 
Test = createobject("component","webapp.model.DealWithObject"); 
dump(Test.getNumberOfParents(Parent)); 
dump(Test.getNumberOfParents(Child)); 
dump(Test.getNumberOfParents(GrandChild)); 
</cfscript> 

<cfcomponent> 
<cfscript> 
// should deal with an infinte number of abstract data types (because of common structure) 
public numeric function getNumberOfParents(component arg){ 
    return -1 + arraylen(structfindkey(getmetadata(arguments.arg),"extends","all")); 
} 
</cfscript> 
</cfcomponent> 
+4

Ce code a-t-il été trouvé sur le Daily WTF? – Will

Répondre

1

Non, juste (et par principe de substitution, il est sous-types.) non. Le polymorphisme signifie que vous n'avez pas à vérifier quel type est quelque chose, vous l'utilisez simplement.

Un exemple serait (C#):

public Boolean AreEqual(Object o1, Object o2) 
{ 
    return o1.Equals(o2); 
} 

La méthode peut accepter tout type d'objet qui hérite de l'objet (en C# presque tout) et objet implémente Equals, vous pouvez donc l'utiliser pour faire la vérifier et ne pas avoir à vérifier le type de tout paramètre.
Habituellement, vous acceptez une sorte d'interface pour vous assurer que l'objet supporte l'opération que vous voulez effectuer.

+0

oui, réalisé moi-même, j'ai changé l'exemple – mrt181

1

Je ne crois pas que ce p puisque la fonction est explicitement affaire avec le type de l'argument any. Le point de pp est que la fonction fonctionne sans tenir compte du type de l'objet.

Si j'introduis un nouveau type dans le système, cette fonction se cassera car elle n'a pas de manipulation particulière.

EDIT: Je pense que votre exemple mis à jour est le polymorphisme de sous-type, puisque la fonction traitera objet et tout cela est sous-types, en vertu de cet objet gère getMetadata

+0

Oui, j'ai relu l'article de Cardelli. Je suppose que mon exemple est mauvais parce que j'utilise des types de données primitifs et abstraits. Je vais le rebrancher. – mrt181

+0

Les types de données primitifs ne sont pas le problème. Chaque fois que vous commencez à écrire du code qui vérifie si l'objet passé est de type Foo/Bar/Whatever vous devriez arrêter et essayer de trouver une autre solution (il y a des cas spéciaux dans lesquels cela serait nécessaire, mais très rares, la sérialisation et ORM nécessitent ces vérifications en interne). – dbemerlin

+0

Donc, l'exemple mis à jour fonctionne comme pp? – mrt181