C# 在每个派生类中调用一个方法
这是一种在每个派生类中按层次调用方法的方法吗 我需要它与用户脚本一起使用,因此我无法强制用户调用base.Update() 不管他打不打基地电话我都要打电话C# 在每个派生类中调用一个方法,c#,inheritance,C#,Inheritance,这是一种在每个派生类中按层次调用方法的方法吗 我需要它与用户脚本一起使用,因此我无法强制用户调用base.Update() 不管他打不打基地电话我都要打电话 public class Base { public virtual void Update() { Console.WriteLine("BASE UPDATE"); ; } } public class Bas
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?非常感谢,我最近因为一些愤怒的帖子而失去了所有的声誉,但我把这篇文章投了更高的票,因为它没有显示出来。非常感谢,我最近因为一些愤怒的帖子而失去了所有的声誉,但我把这篇文章投了更高的票,因为它没有显示出来。