2016-04-28 2 views
1

Ich habe eine abstrakte Superklasse und Subklassen, die davon erben.Definieren von Factory-Methoden in Interfaces oder abstrakten Oberklassen der Produktklasse

Jede Unterklasse MySubclass muss eine public static MySubclass CreateFrom(ISomething something) Factory-Methode haben. Die Schnittstelle ihres Arguments ist für alle Unterklassen gleich, aber der Rückgabetyp muss natürlich immer der Typ der jeweiligen Unterklasse sein.

Kann ich dies irgendwie erreichen, um statische Factory-Methoden zu haben, die einer Interface- oder abstrakten Superklassen-Methodendefinition folgen, ohne eine separate statische Factory-Klasse für jede einzelne Subklasse zu erstellen?

Antwort

1

Wenn die ISomething immer geben die gleiche (oder zumindest eine gemeinsame) ist, können Sie die CreateFrom Methode der machen könnte superclass generic und Rufen Sie den Konstruktor der geerbten Klasse mit dem Parameter auf. Stellen Sie nur sicher, dass alle geerbten Klassen diesen Konstruktor haben (nicht sicher, aber ich glaube nicht, dass es eine Möglichkeit gibt, ein Konstruktormuster zu erzwingen).

public abstract class SuperClass 
{ 
    public static T CreateFrom(ISomething something) 
    { 
     return (T)Activator.CreateInstance(typeof(T), something); 
    } 
} 

public class InheritedClass : SuperClass 
{ 
    public InheritedClass(ISomething something) 
    {} 
} 

diese Weise können Sie Instanzen durch Aufruf

SuperClass.CreateFrom<InheritedClass>(something); 

oder teilen Sie die Erstellung und Initialisierung erstellen:

public abstract class SuperClass 
{ 
    protected abstract void Initialize(ISomething something); 

    public static T CreateFrom(ISomething something) where T : new() 
    { 
     T result = new T(); 
     T.Initialize(something); 
    } 
} 

public class InheritedClass : SuperClass 
{ 
    public InheritedClass() 
    {} 

    protected override Initialize(ISomething something) 
    {} 
} 
0

Sie können keine statischen Elemente an Schnittstellen definieren, da statische Elemente zu einer bestimmten Klasse gehören. Ich kann mir jedoch keinen Grund vorstellen, dies zu benutzen. Sie sollten sich fragen, warum Sie eine solche Funktionalität benötigen. Muss sich eine Unterklasse wirklich selbst instanziieren oder kann das auch mit einer anderen unabhängigen (Fabrik-) Klasse leicht gemacht werden?

Erstellen Sie einfach eine einfache Factory-Klasse mit einem generischen Parameter, der angibt, was erstellt werden soll.

class Factory<T> where T: new() 
{ 
    T CreateFrom(ISomething param) 
    { 
     return new T(); 
    } 

} 

Jetzt können Sie einfach es so nennen:

var myFactory = new Factory<MyClass>(); 
myFactory.CreateFrom(mySomething); 
+0

aber nicht statisch ... – buffjape

+1

Das würde jedoch eine Instanz der Unterklasse erfordern, da die CreateFrom-Methode nicht statisch ist. Ich denke, genau das versucht er zu vermeiden. –

0

ich Zuflucht zu einer anderen Lösung in similiar Art von Anforderung. In meinem übergeordneten Klasse, die ein abstraktes sein habe ich zufällig benötigt eine Instanz der Unterklasse erstellen etwas damit zu tun, so habe ich die folgenden Trick:

public abstract class Element 
{ 
    protected virtual void copyFrom(Element other) 
    { 
    } 

    protected abstract Elememt newInstanceOfMyType(); 
    public object clone() 
    { 
     var instance= newInstanceOfMyType(); 
     instance.copyFrom(this); 
     return instance;   
    } 
} 

nun alle meine Subklassen von Element-Klasse erben erforderlich newInstanceOfMyType Methode außer Kraft setzen Geben Sie die Instanz des Typs frei und überschreiben Sie dann auch die copyFrom-Methode, um einen perfekten Klon zu erstellen. Nun könnte man argumentieren, warum eine abstrakte Clone-Methode nicht die gleiche Arbeit leisten kann? Ja, kann es. Aber ich benötigte eine geklonte Instanz der Unterklasse sowie eine leere Instanz (ohne etwas von der aktuellen zu kopieren), also kam ich auf diese Architektur.

Verwandte Themen