技术说明(草案)#
modelx 在面向对象编程(OOP)范式中体现了软件工程概念,如组合与继承。然而modelx并非编程语言,而是一个对象系统。因此,尽管存在高度相似性,下文为描述modelx规范重新定义了一些OOP术语。阅读规范时,读者应注意这些术语在modelx中的含义可能与OOP语境下的定义有所不同。
modelx核心类型#
Model、Space和Cells是modelx向用户开放操作的核心模型类型。 Models是包含Spaces的顶层对象。Spaces可以嵌套其他Spaces,因此在模型中能形成以Model为根节点的空间树状结构。详见'Space Composition'章节。
在modelx的对象组合层次结构中,空间是介于模型和单元格之间的中间对象。空间可以包含单元格、其他空间和引用。
单元格可以包含计算公式来确定其值,就像电子表格单元格可以包含公式一样。单元格的值既可以通过公式计算得出,也可以直接作为输入赋值。
空间组合#
父空间与子空间
如前所述,空间可以包含其他空间。包含其他空间的空间称为这些空间的父空间,而被包含的空间则称为父空间的子空间。
通过在另一个空间的子空间中递归创建子空间,您可以构建一个空间树。从一个空间衍生出的空间树称为该空间的后代空间。反过来,一个空间的祖先空间是指那些将该空间作为其后代的空间。
子空间不能比其父空间"存活"更久。换句话说,父空间拥有其子空间,即当父空间被删除时,其所有子空间(如果有的话)也会被一并删除。
注意
在面向对象编程(OOP)的语境中,"parent"和"child"这两个术语有时会分别与"base"和"sub"互换使用。 读者需要注意,在本modelx参考文档中,我们仅在组合(composition)语境下使用"parent"和"child"这两个术语, 而在继承(inheritance)语境下则专门使用"sub"和"base"这两个术语。
空间继承#
基础空间与子空间
如果一个空间继承了其他空间,被继承的空间称为继承空间的基空间,而继承空间则被称为被继承空间的子空间。允许多重继承,即一个空间可以拥有多个基空间。
由于一个继承基础空间的空间可以反过来成为其他空间的基础空间,因此您可以创建一个继承关系的有向图。 我们使用术语“空间的基础空间”不仅指那些被该空间直接继承的空间,还包括那些通过继承链间接继承的空间。反过来,如果一个空间是另一个空间的基础空间,那么另一个空间就是该空间的直接或间接子空间。
当一个空间继承另一个拥有子空间的空间时,会在子空间中创建对应的子空间。 子空间中的这些子空间会构成与基础空间中相同的树状层级结构。 子空间中的每个子空间都会继承基础空间树状结构中对应的空间。
一个空间不能继承其子空间。 在本文档后续部分中,将介绍静态空间与动态空间的区别。 静态空间不能被其子空间继承,否则会形成循环继承。 动态空间则可以被其子空间继承。
注意
上文解释的空间继承概念与面向对象编程(OOP)中的概念类似。然而,在modelx语境下,"派生"一词具有特殊含义。在OOP语境中,"一个类派生另一个类"等同于"另一个类继承该类"。
已定义和派生的空间#
如果一个空间继承另一个空间,基础空间的子空间、单元格和引用会在子空间中派生。此外,后代空间及其成员也会被派生。派生空间会将基础空间中对应的原始空间作为其基础空间。
每个静态空间要么是一个已定义的空间,要么是一个派生空间。
重写成员#
当定义与派生单元格和引用同名的新单元格和引用时,派生单元格和引用将被覆盖。
派生空间不能被覆盖,但可以添加或覆盖派生空间的成员。当添加或覆盖派生空间的成员时,该派生空间及其派生的祖先空间将被定义为已定义。
直接包含在model中的空间,即不属于任何其他空间的子空间的空间,始终是已定义的空间。
静态与动态空间#
每个空间要么是静态空间,要么是动态空间。
静态空间是指那些通过显式调用其父级方法创建的空间,或通过空间继承机制自动创建的空间。直接包含在模型中的空间(即不属于任何其他空间的子空间)始终是静态空间。由于它们始终被定义,因此它们始终是已定义且静态的空间。
动态空间,又称参数化空间,是指在其父空间首次调用或订阅操作时创建的空间。此类父空间必须关联有定义动态空间参数并返回初始化动态空间所需参数的公式。
动态空间可以像静态空间一样拥有子空间,无论是通过调用它们的方法,还是通过继承基础空间自动实现。动态空间及其后代统称为动态空间树。
一个动态空间也可以在其动态空间树中包含其他动态空间。
动态空间树中的空间不能作为其他空间的基础空间。
动态空间不会被继承,也就是说,如果一个静态祖先空间包含动态空间,其子空间不会创建与基础空间中动态空间相对应的派生空间。