2016-10-20 4 views
1

派生クラスごとにメソッドを階層的に呼び出す方法ですか?派生クラスごとにメソッドを呼び出す

私はそれをユーザスクリプトで使用する必要があるので、ユーザにbase.Update();を呼び出させることはできません。

ベースコールをしたかどうかにかかわらず呼び出す必要があります。

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

正確には重複しない - その答えは単一の基本メソッドを呼び出す方法を示しています。OPは、実際にそれをコーディングすることなくすべてのオーバーライドされた基本メソッドを階層的に呼び出す必要があります。 – PaulF

+0

いいえ、C#はこれを保証する手段を提供しません。 Mark Phillipsの回答のリンク(http://stackoverflow.com/questions/3747711/call-base-function-then-inherited-function)に示されている*テンプレートパターン*は、 100%に収まらない。 – Heinzi

+0

言語はそうした方法では機能しません。あなたは何をしようとしていますか、Unityを書き直していますか? –

答えて

0

ない洗練された方法が、それはあなたがクラスBaseのオブジェクトを持っている、または基地から派生したクラスのと あなたが利用可能なすべての更新()関数を呼び出したい

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

の作品上から下への階層順(base1/base2/base3)

任意のオブジェクトから、Typeオブジェクトを取得できます。基本クラスの型を尋ねることもできます。それぞれのTypeオブジェクトから、特定の名前のメソッドを知っているかどうかを調べることができます。そうであれば、このメソッドを呼び出すことができます。

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

+0

非常にありがとう、私は最近いくつかの怒りのポストのためにすべての私の評判を失ったが、私はそれがちょうどdoesntのショーをupvoted。 –

関連する問題