Frage

In einem C # -Programm, ich habe eine abstrakte Basisklasse mit einem statischen „Create“ -Methode. Die Create-Methode wird verwendet, um eine Instanz der Klasse zu erstellen und speichern Sie es lokal für die spätere Verwendung. Da die Basisklasse abstrakt ist, wird die Umsetzung Objekte immer daraus ziehen.

Ich möchte in die Lage, ein Objekt aus der Basisklasse abzuleiten, rufen Sie die statische Create-Methode durch die abgeleitete Klasse (einmal in der Basisklasse implementiert), und eine Instanz des abgeleiteten Objekts erstellen.

Gibt es Einrichtungen in der Sprache C #, der mir erlaubt, dies zu abziehen. Meine aktuelle Rückfallposition ist eine Instanz der abgeleiteten Klasse als eines der Argumente für die Create-Funktion übergeben, d.h .:

objDerived.Create(new objDerived(), "Arg1", "Arg2");
War es hilfreich?

Lösung

Versuchen Sie es mit Generika:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

Proben Verwendung:

DerivedClass d = BaseClass.Create<DerivedClass>();

Andere Tipps

Zusammenfassung

Es gibt zwei Möglichkeiten. Die schönere und neuere ist Generika zu verwenden, ist die andere Reflexion zu verwenden. Ich bin die Bereitstellung sowohl im Fall benötigen Sie eine Lösung zu entwickeln, die vor dem .NET 2.0.

funktioniert

Generics

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}

Wenn die Verwendung wäre:

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();

Reflexion

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}

Wenn die Nutzung sei (aufgeteilt auf zwei Linien zur besseren Lesbarkeit):

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));

Sie wollen in einer anderen Instanz abgeleitet erstellen, um eine neue Instanz von einer statischen Factory-Methode auf der abstrakten Basisklasse verwenden? wenn ja, frage ich mich, warum ... Aber ...

 public abstract class MyBase
 {
    public static T GetNewDerived<T>() where T : MyBase, new()
    {
        return new T();
    }    
 }
 public class DerivedA : MyBase
 {
    public static DerivedA GetNewDerived()
    {
        return GetNewDerived<DerivedA>();
    }
 }

 public class DerivedB : MyBase
 {
    public static DerivedB GetNewDerived()
    {
        return GetNewDerived<DerivedB>();
    }
 }     

Ist das, was Sie wollen?

Klingt wie Sie die () -Methode abstrakt erstellen vornehmen müssen. Und wenn Sie das tun, könnte man genauso gut es umbenennen und den Konstruktor sowie machen. Dann können Sie eine andere Init () -Methode, die Sie aufrufen, nachdem das Objekt aufgebaut ist, wenn Sie benötigen, und normale Polymorphismus Effekte werden die Dinge handhaben.

Sie können es nicht ohne fremde Informationen; entweder die Art der abgeleiteten Klasse, eine Instanz davon, oder die voll-qualifizierten Namen der abgeleiteten Klasse. Jedes dieser Programme sind äquivalent zu dem, was Sie bereits tun; es gibt keine bessere Lösung, die ich bin mir dessen bewusst. Das Wesen der statischen Methoden schließt etwas eleganter.

Ich bin nicht sicher, was Ihre Design-Ziele sind, aber von dem, was Sie gefragt, es klingt wie es mit einer Menge von Codegeruch könnte am Ende. Ich glaube, Sie wirklich in die Inversion of Control (IoC) / Dependency Injection (DI) Design-Muster aussehen sollte, die in zahlreichen Frameworks wie Microsoft Unity, Schloss Windsor, StructureMap, Ninject, Spring.Net usw. umgesetzt werden.

Ich denke, wenn Sie einen IoC-Container zu buchen, indem es Ihr Problem in eine viel sauberen und losen gekoppelte Art und Weise lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top