2010-12-15 81 views
0

est-il valide et légal et vers le bas-cast dans le cas suivant:C# question vers le bas-casting

public interface IA { 
    string Property1 {get;} 
} 
public class B { 
    public string Name {get;set;} 
} 

// class A doesn't have it's own fields, all IA methods/properties are implemented through B methods 
public class A:B,IA 
{ 
    public string Property1 
    { 
     get {return this.Name} 
    } 
} 
..... 
B b = new B(); 
A a = (A)b; // will it work ? 

Ou est-il préférable d'utiliser la composition/agrégation?

public class A :IA 
{ 
    private B b; 
    .... 
    public string Property1 {get {return b.Name;} } 
    public A(B b) {this.b = b} 
} 
.... 
B b= new B(); 
A a = new A(b); 

Répondre

2

Le premier exemple ne fonctionnera pas, car A est-un B; une instance de type B peut être être un A, mais dans votre cas, il ne l'est pas. Casting échouera et vous obtiendrez une exception InvalidCastException lors de l'exécution.

Le deuxième exemple fonctionnera car il compilera et s'exécutera comme prévu. Mais sans connaître plus de détails sur votre problème réel (pas un faux problème), je ne peux pas vous dire si c'est le bon modèle.

+0

J'ai interprété le code comme défaillant parce que B n'est pas un A, donc la distribution n'est pas possible, dans le premier cas. Suis-je à la mauvaise extrémité du bâton? –

+0

@Tim: Pas du tout. C'est la même chose que j'ai dite, juste avec des mots différents. :) – cdhowie

+0

Merci pour votre réponse. Mon vrai problème est que je crée une identité personnalisée qui devrait implémenter IIdentity et contenir des informations supplémentaires utiles sur l'utilisateur. J'ai juste essayé d'éviter l'agrégation. – a1ex07

1

Non, ce n'est pas légal. Un Cat est un Animal mais un Animal n'est pas nécessairement un Cat (remplacez A par Cat et B par Animal dans votre exemple).

La composition peut ne pas avoir de sens, comme le montre l'exemple Cat et Animal. La composition est habituellement pour les relations «a» et Animal n'a pas de Cat.

Ce modèle fonctionnera pour votre cas spécifique dépend des types concrets dans votre domaine.

+0

Nitpick: N'importe quel 'Animal' * donné ne peut pas être * un' Cat'. Cela peut aussi être un chat. – cdhowie

+0

@cdhowie: Merci! Et ramasser. – jason