C# 在每个派生类中调用一个方法

C# 在每个派生类中调用一个方法,c#,inheritance,C#,Inheritance,这是一种在每个派生类中按层次调用方法的方法吗 我需要它与用户脚本一起使用,因此我无法强制用户调用base.Update() 不管他打不打基地电话我都要打电话 public class Base { public virtual void Update() { Console.WriteLine("BASE UPDATE"); ; } } public class Bas

这是一种在每个派生类中按层次调用方法的方法吗

我需要它与用户脚本一起使用,因此我无法强制用户调用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
            */

        }
    }

这不是一个优雅的方式,但它的工作

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");
    }
}

这不是一个优雅的方式,但它的工作

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");
    }
}

因此,您有一个类Base的对象,或者一个从Base和 您希望按照从上到下(base1/base2/base3)的分层顺序调用所有可用的Update()函数

从任何对象都可以获得类型对象。您还可以请求基类类型。从每个类型对象中,您可以询问它是否知道具有特定名称的方法。如果有,您可以调用此方法

  • Object.GetType()
  • Type.BaseType
  • Type.GetMethod(字符串)
  • MethodInfo.Invoke


因此,您有一个类Base的对象,或者一个从Base和 您希望按照从上到下(base1/base2/base3)的分层顺序调用所有可用的Update()函数

从任何对象都可以获得类型对象。您还可以请求基类类型。从每个类型对象中,您可以询问它是否知道具有特定名称的方法。如果有,您可以调用此方法

  • Object.GetType()
  • Type.BaseType
  • Type.GetMethod(字符串)
  • MethodInfo.Invoke


不完全是重复的-该答案显示了如何调用单个基方法-OP希望在不实际编码的情况下分层调用所有重写的基方法。不,C#无法确保这一点。中演示的模板模式是您的最佳选择,即使它不适合100%。该语言不是这样工作的。你想做什么,重写Unity?不完全是重复的-这个答案显示了如何调用单个基方法-OP希望在没有实际编码的情况下按层次调用所有重写的基方法。不,C#无法确保这一点。中演示的模板模式是您的最佳选择,即使它不适合100%。该语言不是这样工作的。你想做什么,重写Unity?非常感谢,我最近因为一些愤怒的帖子而失去了所有的声誉,但我把这篇文章投了更高的票,因为它没有显示出来。非常感谢,我最近因为一些愤怒的帖子而失去了所有的声誉,但我把这篇文章投了更高的票,因为它没有显示出来。