2009-03-16 12 views
1

Ich habe SalesMan Klasse, die von User Klasse geerbt wird und implementiert auch ISalesMan Schnittstelle.Vererbung und Konvertierung von Objekten

public class SalesMan : User, ISalesMan 
{ 
... 
} 

Ich brauche User Objekte in SalesMan Objekte zu konvertieren. Ich verstehe, dass direkte Gießen von User Art von Objekten in SalesMan Typ ist nicht möglich. Wie sollte ich die Konvertierung machen? Ich denke, zwei verschiedene Arten:

  1. für SalesMan Klasse Erstellen Konstruktor, User Parameter und initialisiert ein neues SalesMan Objekt auf der Grundlage der gegebenen User nimmt.

  2. Erstellen von neuen Verfahren für die SalesMan Klasse, die User als Parameter und gibt ein neues SalesMan Objekt auf der Grundlage der gegebenen User Parameter.

... oder gibt es einen noch schlaueren Weg, um diese Art von Problem zu lösen?

Antwort

4

Der in Option 1 beschriebene Konstruktor ist, was ich erwarten würde, wenn ich um eine unbekannte API stochern würde.

Sie können langweilige Bestien sein, um zu schreiben, und Sie können vergessen, sie zu aktualisieren, wenn Sie der Benutzerklasse neue Felder hinzufügen. Erwägen Sie daher (wenn Leistungsaspekte dies zulassen) das Schreiben eines "intelligenten" Konstruktors mithilfe der Reflektion along the lines of this example.

Auf der Frage des Konstrukteure im Vergleich zu Factory-Methoden bieten die Framework Design Guidelines die folgenden Hinweise:

  • DO Konstrukteurs-Fabriken bevorzugen, weil sie im Allgemeinen mehr verwendbar, konsistenter, und bequem dann spezialisiert sind Konstruktionsmechanismen.

  • Verwenden Sie eine Fabrik, wenn Sie mehr Kontrolle benötigen als von Konstruktoren über die Erstellung der Instanzen zur Verfügung gestellt werden.

  • DO eine Fabrik verwenden, in denen ein Entwickler nicht, welche Art zu
    Konstrukt, wie bei der Codierung
    gegen einen Basistyp oder Schnittstelle kennt.

  • Verwenden Sie eine Fabrik, wenn eine benannte Methode die einzige Möglichkeit ist, die Operation selbsterklärend zu machen.

+0

Der im Artikel beschriebene "intelligente" Kopierkonstruktor funktioniert nur für Werttypfelder. Wenn viele Instanzen wie folgt erstellt werden müssen, ist Reflection möglicherweise zu langsam. –

+0

Ich würde Option 1 nicht als Kopierkonstruktor bezeichnen. Sie haben normalerweise folgende Form: MyClass (MyClass o) Dies würde Conversion-Konstruktor in C++ genannt werden –

+0

@Seb Rose Sie haben Recht - bearbeitet. –

0

Option 1 ist die sauberste und intuitivste Variante.

0

Wenn Sie wirklich ein Verkäufer Objekt aus einem Benutzerobjekt dann eine der beiden Optionen erstellen möchten Sie beschreiben funktionieren würde.

Aber ich denke, du musst dich fragen, was du versuchst zu tun. Wann/Warum wird ein Benutzer ein SalesMan? Versuchen Sie, das Verhalten eines vorhandenen Objekts zu ändern? Verändern sich Verhaltensweisen regelmäßig in Ihrem System?

Je nach Ihren Anforderungen können Sie die Strategie- oder Vorlagenmethode verwenden.

0

Ich benutze Option 1. Upgrade-Konstruktor oder Conversion-Konstruktor.

0

Die Antworten, die Sie bereits erhalten haben, sind mehr als ausreichend. Wie auch immer, ich habe bemerkt, dass du erwähnt hast, dass Casting nicht möglich ist. Wenn Sie einen Grund haben, Casts zu verwenden, können Sie ermöglichen, indem Sie einen Operator überladen.

public static explicit operator SalesMan(User user) 
{ 
    // Your logic to create a new SalesMan using data from user. 
} 

Bestimmung, welche Lösung ist smarter mehr Informationen benötigen, als in Ihrer ursprünglichen Post zur Verfügung gestellt. Allerdings tendiere ich dazu, auf die Seite der Vollständigkeit und Vielseitigkeit zu blicken und würde beides in Betracht ziehen.

public class SalesMan 
{ 
    public SalesMan(User user) 
    { 
     // Your logic to create a new SalesMan using data from user. 
    } 

    public static explicit operator SalesMan(User user) 
    { 
     return new SalesMan(user); 
    } 
} 

Und Ian hat Recht. Als allgemeine Faustregel gilt: Verwenden Sie eine Factory nur dann, wenn Sie eine funktionale Anforderung haben, die nicht mit einem Konstruktor erfüllt werden kann, oder dass die Einschränkungen der Sprache sich Ihnen in den Weg stellen. Zum Beispiel benötigen Sie zwei verschiedene Konstruktoren mit einer identischen Signatur.