gdscript:动态语言简介 |
您所在的位置:网站首页 › godot怎么读取字符串变成可执行代码 › gdscript:动态语言简介 |
鸭子打字¶
当从静态类型语言转移到动态类型语言时,最难理解的概念之一是duck-typing。duck打字使得整个代码设计变得简单和简单,但是它的工作方式并不明显。 举个例子,想象一下这样一种情况:一块大石头从隧道里掉了下来,砸碎了路上所有的东西。用静态类型语言编写的rock代码如下: void BigRollingRock::on_object_hit(Smashable *entity) { entity->smash(); }这样,任何能被石头砸碎的东西都必须继承可砸碎的东西。如果一个人物、敌人、一件家具、一块小石头都是可以粉碎的,那么他们就需要从这个类中继承可粉碎的,可能需要多重继承。如果不希望有多个继承,那么它们必须继承一个类似于类的公共实体。然而,添加虚拟方法并不是很优雅 smash() 只有在其中一些可以被粉碎的情况下,才能成为实体。 对于动态类型语言,这不是问题。duck输入确保您只需要定义 smash() 在需要的地方运行,就是这样。不需要考虑继承、基类等。 func _on_object_hit(object): object.smash()就这样。如果击中大石头的对象有一个smash()方法,它将被调用。不需要继承或多态性。动态类型语言只关心具有所需方法或成员的实例,而不关心它继承的内容或类类型。duck类型的定义应该更清楚: “当我看到一只像鸭子一样走路、像鸭子一样游泳、像鸭子一样嘎嘎叫的鸟时,我就叫它鸭子。” 在这种情况下,它转换为: “如果物体可以被砸碎,不管它是什么,只要砸碎它就行了。” 是的,我们应该称之为“笨重的打字”。 可能被击中的对象没有smash()函数。有些动态类型语言在方法调用不存在时(如目标C)会忽略它,但gdscript更严格,因此需要检查函数是否存在: func _on_object_hit(object): if object.has_method("smash"): object.smash()然后,简单地定义这个方法以及任何岩石接触到的东西都可以被粉碎。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |