2017-05-10 2 views
-3

Ich weiß, ich habe gelesen und weiß, dass statische Abstracts nicht existieren. Dennoch würde ich gerne wissen, wie ich die Idee, alle Instanzen zu erhalten, die von einer abstrakten Klasse stammen, sicher umsetzen kann. Ich weiß, dass ich eine Hilfsmethode schreiben kann, aber ich möchte lieber eine abstrakte Klasse erstellen, die eine statische abstrakte Methode hat, die jede abstrakte Unterklasse persönlich implementieren muss. um nur einen Satz von abgeleitetenInstanzen zu haben.C# public abstrakte Methode zum Erstellen und Ableiten von Instanzen

Hier ist, was ich mit ...

public abstract class _ScriptableAbstract : ScriptableObject 
{ 
    protected static _ScriptableAbstract[] DerivedInstances; 

    public static abstract _ScriptableAbstract[] GetDerivedInstances(); 
} 

und der Klasse, dass

public abstract class _EmergeAnimation : _ScriptableAbstract 
{ 
    protected GameObject gameObject; 

    public abstract void Setup(GameObject gameObject); 
    public abstract IEnumerator Execute(); 

    public static _EmergeAnimation[] GetDerivedInstances() 
    { 
     if (DerivedInstances == null) 
     { 
      DerivedInstances = Instances created with Activator/ScriptableObject and Reflection. 
     } 
     return DerivedInstances; 
    } 
} 

für mich So wäre es am besten Gattungsgemäße Verfahren mit der _ScriptableAbstract Klasse zu benutzen, wäre die Umsetzung kam so Ich kann diese statische Zusammenfassung verwenden.

Nun, das ist das Beste, was ich erklären kann. Es ist spät und ich bin müde. Alles zu verbalisieren macht es komplizierter. Eigentlich bin ich froh, dass ich mit meinem Bauch programmiere und nicht mit meinem Kopf ^^

Antwort

1

Versuchen Sie eine Art von Animation zu erreichen, indem Sie eine Basisklasse einen "Zustand" implementieren und dann jede geerbte Klasse einen weiteren Zustand bereitstellt, Wenn Sie also von der Basisklasse starten und die Methode für alle geerbten Klassen aufrufen, wird eine Animation ausgeführt.

Wenn ja, dann ist verschachtelte Vererbung nicht der Weg zu gehen. Es ist einfach nicht für diesen Zweck gedacht. Vererbung ermöglicht Klassen zu überschreiben, was ihre Basisklasse tut. Es kann nicht forcieren sie alles überschreiben oder sicherstellen, dass jede Klasse eine Methode anders implementieren wird. Sogar eine abstrakte Klasse kann nur vererbte Klassen benötigen, um eine Methode zu implementieren. Nach der Implementierung können Sie ererbte Klassen nicht erzwingen, um sie zu überschreiben.

Wenn Sie 5, 10 oder 20 Klassen haben möchten, die jeweils von einer abstrakten Klasse erben, können Sie einfach diese Klassen schreiben, die direkt von dieser Klasse erben. Sie müssen nicht von sich, wie dies erben:

public abstract class MyBase{} 
public class Inherited : MyBase{} 
public class Inherited2 : Inherited {} 
public class Inherited3 : Inherited2 {} 

etc. Es würde einfach nicht Nutzen sein. Aber Sie könnten dies tun:

public abstract class MyBase {} 
public class Inherited : MyBase {} 
public class Inherited2 : MyBase {} 
public class Inherited3 : MyBase {} 

Und haben dann eine Sammlung wie folgt aus:

var steps = new List<MyBase>(); 
steps.Add(new Inherited()); 
steps.Add(new Inherited2()); 
steps.Add(new Inherited3()); 

Dann anstatt zu versuchen, durch die Klassen und Unterklassen zu gehen, die Sie gerade durch die Elemente in der Auflistung durchlaufen und Rufen Sie bei jedem die gleiche Methode an. Jeder kann die abstrakte Methode anders implementieren.

Sie könnten sogar feststellen, dass Sie eine Schnittstelle anstelle einer abstrakten Klasse verwenden können.

Das ist nur ein vereinfachtes Beispiel. Aber Sie können selbst sehen, wie das Problem schnell unordentlich wird, sobald Sie versuchen, verschachtelte Vererbung zu verwenden. Das passiert sogar in einfacheren Szenarien. Wenn die Vererbung unordentlich wird, ist es gut, zurückzutreten und zu fragen, warum Sie es verwenden.

+0

Ich weiß das. Ich arbeite gerade an einem ausführlichen Editor. Dort möchte ich Klassen erstellen, die von einer Elternklasse abgeleitet sind, so dass sie immer dann als Auswahl aufgeführt werden, wenn ich ein Feld mit einer abstrakten Klasse wie _EmergeAnimations habe. Wenn diese Option ausgewählt ist, wird die Setup-Methode der abgeleiteten Klasse und die nachfolgende Execute Coroutine aufgerufen. (Gibt viel mehr Freiheit als Animationen) (Ich habe die Frage aktualisiert) –

0

In Ordnung, Schrott, eigentlich alles, was ich wollte, war nur eine Liste von abgeleiteten Klassen und die Konsistenz zu schaffen, diese Methode aufrufen zu können. einer abstrakten Klasse, die von einer abstrakten Klasse angetrieben wurde. Ich denke, ich muss etwas anderes finden.

Moderator Bitte löschen Sie diese Frage. Alle kleinen Minuspunkte haben meinem Blödsinn einige Einsichten gegeben.

Verwandte Themen