【问题标题】:How can I call an Inherited function to execute when declared in child class在子类中声明时如何调用继承函数来执行
【发布时间】:2018-02-11 02:19:46
【问题描述】:

从 Unity 3D 获取此示例代码

public class Enemy : MonoBehaviour 
{
    void Start()
    {

    }

    void Update()
    {
       transform.postion = Vector3.Lerp(transform.position, new Vector3(0, 1, 0), 5f * Time.deltaTime);
    }
}

如您所见,Enemy 类继承自 MonoBehavior,其中包含 StartUpdate 方法。我所要做的就是把我自己的代码放在那里,但是,我想知道如何创建一个类似的东西,例如在 Java 中构建一个聊天 API,我会将它布置给消费者以访问我的基类,并且会有一个像“更新”这样的函数,每秒执行一次,而无需手动编写 while 循环。

如何创建一个子类声明时可以自动调用的基类函数?我对任何人都可以回答的任何编程语言持开放态度,我只想知道这背后的逻辑。

【问题讨论】:

  • 这对于 Stack Overflow 来说太宽泛了。 Unity 内部使用(很可能无法验证)反射以确定是否声明了Start 和其他方法。不过,c# 中没有任何内置功能可以让您执行此操作。
  • 不存在仅通过声明即可调用的方法。就像没有汽车这样的东西会因为它被制造出来而被驱动。在调用方法之前,它永远不会执行任何操作。
  • @ScottHannen 是的,我了解您,先生,我认为它在运行时被 Unity 调用。把它想象成 JApplet,draw() 方法每帧调用一次。我想知道的是进程名称,所以我可以研究它。老实说,这就像我在编程中没有做过的事情之一。
  • @CamiloTerevinto 明白了!
  • 你可以使用多态性。这就是 XNA 的做法。 Unity 选择了清单样式系统。在编译时,MonoBehaviour 脚本会扫描特定的方法,然后以某种方式用实现的方法标记它们。那里没有反射。

标签: c# oop unity3d


【解决方案1】:

基类可以在其构造函数中创建一个计时器,该计时器被设置为以 1 秒的间隔调用抽象方法。

public abstract class BaseClass
{
    private Timer _timer;

    protected BaseClass()
    {
        _timer = new Timer();
        _timer.Tick += (sender, args) => 
       {
          Console.WriteLine("Calling Update."); 
          Update();
       };
        _timer.Interval = 1000;
        _timer.Start();            
    }

    protected abstract void Update();
}

public class InheritedClass : BaseClass
{
    protected override void Update()
    {
        Console.WriteLine("Update was called.");
    }
}

您可以在控制台应用程序中使用它来演示功能。

public class Program
{
    public static void Main(string[] args)
    {
        var inheritedClass = new InheritedClass();
        Console.ReadLine();
    }
}

【讨论】:

  • 我知道你从哪里来,这个逻辑我可以理解并且非常容易理解。谢谢先生的回答。
  • 不是每个类都有它的计时器,而是一个新类注册到一个管理器,然后管理器在集合上运行一个 foreach。
  • 我同意@Everts。没有深入,只是展示了一个简单的示例,说明如何在特定时间间隔调用方法,而无需使用您的框架的人编写该代码。
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2022-12-04
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2014-06-29
相关资源
最近更新 更多