2010-12-15 7 views
0

Ist es gültig und legal und nach unten Guss im folgenden Fall:C# Down-Guss Frage

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 ? 

Oder ist es besser Zusammensetzung/Aggregation zu benutzen?

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); 

Antwort

2

Das erste Beispiel wird nicht funktionieren, weil A ist-a B; eine Instanz des Typs B könnte ein A sein, aber in Ihrem Fall ist es nicht. Das Casting schlägt fehl und Sie erhalten zur Laufzeit eine InvalidCastException.

Das zweite Beispiel wird funktionieren, in dem es wie erwartet kompiliert und ausgeführt wird. Aber ohne mehr Details über Ihr tatsächliches Problem zu wissen (kein Scheinproblem) kann ich Ihnen nicht sagen, ob dies das richtige Muster ist.

+0

Ich interpretierte den Code als fehlgeschlagen, weil B ist kein A, so dass die Besetzung nicht möglich ist, im ersten Fall. Bin ich am falschen Ende des Stockes? –

+0

@Tim: Überhaupt nicht. Das ist das Gleiche, was ich gesagt habe, nur mit anderen Worten. :) – cdhowie

+0

Danke für deine Antwort. Mein wirkliches Problem ist, dass ich eine benutzerdefinierte Identität erstelle, die IIdentity implementieren und zusätzliche nützliche Informationen über Benutzer enthalten sollte. Ich habe gerade versucht, die Aggregation zu vermeiden. – a1ex07

1

Nein, das ist nicht legal. A Cat ist ein Animal aber ein Animal ist nicht unbedingt ein Cat (ersetzen A durch Cat und B von Animal in Ihrem Beispiel).

Zusammensetzung möglicherweise nicht sinnvoll, wie die Cat und Animal Beispiel wieder zeigt. Die Zusammensetzung ist normalerweise für "hat eine" Beziehungen, und eine Animal hat keine Cat.

Welches Muster für Ihren speziellen Fall funktioniert, hängt von den konkreten Typen in Ihrer Domäne ab.

+0

Nitpick: Irgendein gegebenes 'Tier' * darf nicht * eine' Katze' sein. Es könnte auch * eine Katze sein. – cdhowie

+0

@cdhowie: Danke! Und heb ab. – jason