2009-09-11 5 views
3

Je pense que j'ai enfin le point de contraintes, mais encore un peu confus. Quelqu'un peut-il me dire si ce qui suit est juste? Fondamentalement, si vous héritez d'une classe, vous voudrez peut-être vous assurer que la classe dont vous héritez hérite également d'une autre classe ou d'une autre interface. Il est déroutant parce que vous savez probablement que vous voudriez seulement hériter d'une classe qui avait les choses que vous vouliez mais je suppose qu'avec les génériques, vous pouvez obtenir une erreur de compilation à un moment donné et ne pas savoir que le problème provient le fait que certaines classes ne soient pas héritées ailleurs et vous pouvez obtenir des erreurs qui ont un sens si vous ajoutez des contraintes dans les bonnes zones.Essayer de comprendre le point de contraintes - suis-je sur la bonne voie?

Est-ce que cela a du sens? Suis-je sur la bonne voie?

Répondre

4

Je ne pense pas que ce soit le point de contraintes, (mais je peux me tromper). Si je comprends bien, les contraintes n'ont pas grand chose à voir avec l'héritage, en soi. Ce que vous faites est de mettre des contraintes sur le type qui peut être utilisé si vous utilisez (instanciation) une classe qui a des arguments de type.

classes avec des arguments de type sont comme Mad-libs, et les contraintes sont comme les instructions qui apparaissent sous les blancs: «Bob aiment ______ avec ses amis tous les soirs »

(c'est un madlib)

"Bob aime _ (verbe) ___ avec ses amis tous les soirs" (un madlib avec des instructions).

Vérifiez ceci:

//class with type arguments 
public class MadLib<W> { 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 


//class with type arguments and contraints (note i'm not inheriting nothin) 
public class MadLib<W> where W:Verb{ 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 
+0

Grâce à tooshel! Toutes les réponses ici ont été très utiles, bien que j'aime particulièrement l'analogie madlib! – NobodyMan

0

Vous ne pouvez hériter d'une classe, mais vous pouvez mettre en œuvre plusieurs interfaces. L'héritage signifie que votre classe hérite de toutes les propriétés et méthodes spécifiées par la classe de base. Tant qu'ils ne sont pas marqués comme privés, la classe héritière peut appeler ces méthodes comme elle est propre.

2

Pas vraiment. Les contraintes s'appliquent uniquement lorsque vous définissez un templare de classe générique (et non lorsque vous héritez d'une classe). Lorsque vous définissez un générique, vous dites qu'il s'agit d'un "modèle" ou d'un modèle, pour une classe encore indéfinie/inconnue avec un type T encore inconnu, qui sera créé ailleurs sur la base de ce modèle et avec un T. Type prévu explicitement les limites de contraintes quels types T peuvent être utilisés dans l'autre endroit où vous créez en fait le type réel à partir du modèle/modèle

comme dans

//Define the generic here, with arbitrary type T 
public class MyClass<T> where T: SomeOtherClass 
    { 
    // template/pattern methods, proerpties, fields, etc. 
    } 

Créer une classe réelle ici avec le type explicitement fourni "DerivedClass"

public MyClass<DerivedClass> myC = new MyClass<DerivedClass>(); 

qui succédera si et seulement si ClasseDérivée hérite de SomeOtherClass

4

Pas exactement. Les contraintes sont utilisées pour spécifier quels comportements et/ou types un paramètre générique peut présenter.

Par exemple, si vous déclarez une classe:

class GenericDisposableHandler<T> 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // can't really do much with T since its just an object type 
    } 
} 

et savez pertinemment que le paramètre générique T doit toujours être quelque chose qui implémente IDisposable, vous feriez:

class GenericDisposableHandler<T> where T : IDiposable 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // Now you can treat T as IDisposable 
     someVariable.Dispose(); 
    } 
} 

Il sont many other constraint types you can use.

Questions connexes