C# 在子类中声明时,如何调用继承的函数来执行
从Unity 3D获取此示例代码C# 在子类中声明时,如何调用继承的函数来执行,c#,oop,unity3d,C#,Oop,Unity3d,从Unity 3D获取此示例代码 public class Enemy : MonoBehaviour { void Start() { } void Update() { transform.postion = Vector3.Lerp(transform.position, new Vector3(0, 1, 0), 5f * Time.deltaTime); } } 正如您所看到的,类foreign继承自monobhav
public class Enemy : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.postion = Vector3.Lerp(transform.position, new Vector3(0, 1, 0), 5f * Time.deltaTime);
}
}
正如您所看到的,类foreign
继承自monobhavior
,其中包含Start
和Update
方法。我所要做的就是把我自己的代码放在那里,但是,我想知道如何创建一个类似的东西,比如在Java中构建聊天API,我将把它展示给消费者,让他们只访问我的基类,并拥有一个像“Update”这样的函数,它每秒钟执行一次,而不必手动编写while循环
如何创建一个基类函数,当子类声明它时可以自动调用它?我对任何人都可以回答的编程语言持开放态度,我只想知道这背后的逻辑。基类可以在其构造函数中创建一个计时器,该计时器设置为以1s的间隔调用抽象方法
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();
}
}
这对于堆栈溢出来说太宽了。Unity在内部使用(很可能是无法验证)反射来确定是否声明了
Start
和其他方法。不过,c#中没有任何内置功能允许您这样做,也没有只通过声明就可以调用的方法。就像没有什么汽车能仅仅因为它是造出来的就被驱动一样。“在一个方法被调用之前,它不会做任何事情。”ScottHannen是的,我理解你,先生,我认为它是在运行时被Unity调用的。就像JApplet一样,draw()方法每帧调用一次。我想知道的是,这个过程的名称,所以我可以研究它。老实说,这是我在编程中没有学过的东西之一。@Camiloteriento明白了!您可以使用多态性。XNA就是这样做的。Unity选择了清单式系统。在编译时,MonoBehavior脚本会被扫描特定的方法,然后它会以某种方式用实现的方法来标记它们。没有思考。我知道你来自哪里,这个逻辑我可以理解,它非常容易理解。谢谢你的回答。不是每个类都有计时器,而是一个新的类注册到一个经理,然后经理在集合上运行foreach。我同意@Everts。没有深入讨论,只是展示了一个简单的示例,说明如何在特定的时间间隔内调用一个方法,而使用您的框架的人不需要编写代码。