2016-10-20 2 views
1

Ist es eine Möglichkeit, eine Methode in jeder abgeleiteten Klasse hierarchisch aufzurufen?Aufruf einer Methode in jeder abgeleiteten Klasse

Ich brauche es, um es mit Benutzer-Skripten zu verwenden, so kann ich den Benutzer nicht zwingen, base.Update() aufzurufen;

Ich brauche es angerufen werden, ob er den Basisanruf getan hat oder nicht.

public class Base 
    { 
     public virtual void Update() 
     { 
      Console.WriteLine("BASE UPDATE"); 
      ; 
     } 
    } 
    public class Base2 : Base 
    { 
     public override void Update() 
     { 
      Console.WriteLine("BASE2 UPDATE"); 
      ; 
     } 
    } 
    public class Base3 : Base2 
    { 
     public override void Update() 
     { 
      // base.Update() ? no no, i want to do it for User Scripts so i cant force user to call base.Update() 
      Console.WriteLine("BASE3 UPDATE"); 
     } 
    } 
    public class TestClass 
    { 
     public void DoTheTest() 
     { 
      Base3 instance = new Base3(); 
      instance.Update(); 
      // the output i need: 
      /* 
       BASE UPDATE 
       BASE2 UPDATE 
       BASE3 UPDATE 
      */ 

     } 
    } 
+0

Nicht genau ein Duplikat - diese Antwort zeigt, wie eine einzelne Basismethode aufgerufen wird - OP möchte alle überschriebenen Basismethoden hierarchisch aufrufen, ohne sie tatsächlich zu codieren. – PaulF

+0

Nein, C# bietet keine Möglichkeit, dies zu gewährleisten. Das * Template-Muster *, wie es in der [link in Mark Phillips 'Antwort] (http://stackoverflow.com/questions/3747711/call-base-function-then-inherited-function) gezeigt wird, ist Ihre beste Wette, auch wenn es passt nicht 100%. – Heinzi

+0

Die Sprache funktioniert nicht so. Was versuchst du zu tun, schreibe Unity um? –

Antwort

0

Nicht eine elegante Weise, aber es funktioniert

public interface IUpdateHandler 
{ 
    void UpdateHandler(); 
} 

public class Base : IUpdateHandler 
{ 
    public Base() 
    { 
     OnUpdate += (s, e) => UpdateHandler(); 
    } 

    public void Update() 
    { 
     OnUpdate(this, null); 
    } 

    public void UpdateHandler() 
    { 
     Console.WriteLine("BASE UPDATE"); 
    } 

    protected event EventHandler OnUpdate; 
} 

public class Base2 : Base, IUpdateHandler 
{ 
    public Base2() 
    { 
     OnUpdate += (sender, args) => UpdateHandler(); 
    } 

    public new void UpdateHandler() 
    { 
     Console.WriteLine("BASE2 UPDATE"); 
    } 
} 

public class Base3 : Base2, IUpdateHandler 
{ 
    public Base3() 
    { 
     OnUpdate += (sender, args) => UpdateHandler(); 
    } 

    public new void UpdateHandler() 
    { 
     Console.WriteLine("BASE3 UPDATE"); 
    } 
} 
0

So können Sie ein Objekt der Klasse Basis haben oder von einer abgeleiteten Klasse von Basis- und Sie alle verfügbaren Update() Funktionen aufzurufen in eine hierarchische Reihenfolge von oben nach unten (Basis1/Basis2/Basis3)

Von jedem Objekt können Sie das Type-Objekt erhalten. Sie können auch nach dem Basisklassentyp fragen. Von jedem Type-Objekt können Sie fragen, ob es eine Methode mit einem bestimmten Namen kennt. Wenn dies der Fall ist, können Sie diese Methode aufrufen.

  • Object.GetType()
  • Type.BaseType
  • Type.GetMethod (string)
  • MethodInfo.Invoke

.

+0

vielen Dank, ich verlor alle meine Reputation vor kurzem für einige Wut Post, aber ich upvoted diese eine es zeigt einfach nicht. –

Verwandte Themen