Jump to content
模组网
icedream

【Creation Kit 学习指南 33】继承

Recommended Posts

概述

脚本继承是一个用来指示脚本要做什么的行为,可以在不修改原始脚本的情况下通过修改一些事件或函数来做不同的事情。

术语解释

  • 父类:被继承的原始脚本。
  • 子类:继承父类的脚本。
  • 继承:如果一个子类在没有更改父类的前提下从父类获得东西,那么它“继承”父类。
  • 优先权:如果一个子类脚本通过创建新的版本来改变父类中的一些行为,那么它“优先于”父类版本。
如何继承

继承一个脚本非常简单:在脚本上方的"scriptname x"后面添加"extends y",y是你要继承的脚本名称。

例如:

Scriptname SpikeTrap extends Trap
在此情况下,"SpikeTrap"脚本继承"Trap"脚本。你可以认为它们之间有某种联系。

继承脚本有何作用

函数和事件

子脚本可以读写父脚本中的所有函数和事件。任何不在子脚本中执行的函数和事件都要通过继承获得。如果函数和事件在父脚本中执行,而你又想让它在子脚本中执行,当子脚本的优先权高于父脚本时,那么任何对函数和事件的调用将使用子脚本的版本代替。注意当你在子函数中执行函数或事件时,你“必须”使参数和返回类型匹配,名称可以除外。如果你的脚本没有汇编。

例如:

Scriptname ParentScript
 
Function MyFunction()
	Debug.Trace("Parent MyFunction!")
EndFunction
 
Function MyOtherFunction()
	Debug.Trace("Parent MyOtherFunction!")
EndFunction


Scriptname ChildScript extends ParentScript
 
Function MyFunction()
	Debug.Trace("Child MyFunction!")
EndFunction
  • 链接子脚本并从中调用MyFunction:
Child MyFunction!
子脚本具有优先权,并把父脚本中的函数替换为它自己的。
  • 链接父脚本并从中调用MyFunction:
Parent MyFunction!
在此情况下子脚本并不存在,旧的父函数功能保持不变。
  • 链接其它脚本并从中调用MyFunction:
Parent MyOtherFunction!
子脚本对此函数并不具有优先权,因此原始父函数可以使用。

从父类中调用函数

如果你希望真正从父脚本中调用函数,并忽略你自己脚本中的函数,那么你可以使用特殊"父"变量。注意此变量只工作在此脚本中,你不能在不同脚本中调用它。如果你想在父脚本完成所有繁重任务之前对某些内容做细微调整,那么可以使用这个方法。

例如:

Scriptname ChildScript extends ParentScript
 
Function MyFunction()
	Debug.Trace("Child MyFunction!")
	parent.MyFunction()
EndFunction
  • 在子脚本中调用MyFunction并链接一个目标:
Child MyFunction!
Parent MyFunction!
注意父变量会强迫调用父版本的函数,而非子版本的函数。

状态

子脚本的状态会和父脚本的状态相结合。子类的相同状态的函数将会优先于父类中的函数,所有的状态会结合。

  • 父类有状态,子类没有:此状态的父函数将会被使用。
  • 子类有状态,父类没有:此状态的子函数将会被使用。
  • 父类的函数有状态,子类的没有:父版本将会被使用。
  • 子类的函数有状态,父类的没有:子版本将会被使用。
  • 所有函数有相同状态:子版本将会被使用。
属性

属性在父脚本中的表现和在子脚本中的类似。然而,你不能在子脚本中拥有做其它事情的特权。如果你试图做权限以外的事,那么编译器将提示你。

例如:

Scriptname ParentScript
 
int Property MyProperty Auto

 

Scriptname ChildScript extends ParentScript
 
Function MyFunction()
	Debug.Trace("MyProperty = " + MyProperty)
EndFunction
注意MyProperty在子脚本中使用,即使它存在于父脚本中。

变量

变量是私有的且不能被其它包括父脚本和子脚本之类的脚本看到。变量名称和父脚本中的相同将会在读写子脚本函数时隐藏父变量。父类的函数将使用它自己的变量。

例如:

Scriptname ParentScript
 
int MyVar = 1
 
Function MyFunction()
	Debug.Trace("Parent MyVar = " + MyVar)
EndFunction

Scriptname ChildScript extends ParentScript
 
string MyVar = "Hello World!"
 
Function MyFunction()
	Debug.Trace("Child MyVar = " + MyVar)
	parent.MyFunction()
EndFunction
  • 调用子脚本中的MyFunction并链接一个目标:
Child MyVar = Hello World!
Parent MyVar = 1
注意所有脚本只能看见变量的本地复制。

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...