gpt4 book ai didi

c# - 使用覆盖调用基类方法 *WITHOUT*

转载 作者:太空宇宙 更新时间:2023-11-03 21:49:04 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用我注意到的 c# 做一些事情,尤其是 Unity引擎确实如此。这似乎是某种形式的实现或子类化,但由于我没有源代码,所以我不知道。

在 Unity 中所有的脚本都是这样的:

class someclass : MonoBehavior
{
}

现在有一个函数列表,您可以使用引擎通过 MonoBehavior 在您的类中调用这些函数,例如

void OnGUI()
{
so something here
}

所以如果你说 5 个脚本都包含 OnGUI 函数,它会在所有 5 个脚本中调用

我想自己实现这种类型的东西,但我想不通。

你如何编写一个基类或实现或任何在你的子类中调用预定义函数但不要求函数的子类并且不必在它们中使用重写的东西?

这是来自 unity Engine 的示例源文件:

public class EnemyAttack : MonoBehaviour {
// Use this for initialization
void Start () {
AttackTimer = 0;
CoolDown = 2.0f;
}
// Update is called once per frame
void Update () {
if (AttackTimer > 0) AttackTimer -= Time.deltaTime;
if (AttackTimer < 0) AttackTimer = 0;

if (AttackTimer == 0){
Attack();
AttackTimer = CoolDown;
}
}
}

该代码完美运行,然后引擎调用在第一次启动时开始(单次调用)并调用更新每个帧注意绝对没有覆盖在该代码中的任何地方

它似乎是某种事件系统,但我在谷歌上找不到任何描述如何做到这一点的内容。

最佳答案

如果您不想/不能使用 override 关键字,您可以使用反射(可能使用 dynamic 关键字)来做到这一点

基类“简单地”在派生类中搜索特定的签名/属性并调用方法。

如果您自己编写此代码,请考虑缓存反射结果(或使用可能为您缓存的 dynamic 关键字)并测试您是否仍能获得所需的性能。反射可能非常慢。也看到这个问题:Dynamic Lang. Runtime vs Reflection

例子:

class TheBehavior
{
public void Act()
{
dynamic derived = this;
try
{
derived.Foo(42);
derived.Foob(43);
}
catch (RuntimeBinderException e)
{
Console.WriteLine("Method call failed: " + e.Message);
}
}
}

class TheDerived : TheBehavior
{
public void Foo(int bar)
{
Console.WriteLine("Bar: " + bar);
}
}

class Program
{
static void Main(string[] args)
{
TheBehavior behavior = new TheDerived();
behavior.Act();
Console.ReadKey(true);
}
}

关于c# - 使用覆盖调用基类方法 *WITHOUT*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15428285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com