我可以在 Ballerina 文档中看到以下关于类型等价和继承的描述。
Ballerina 基于类型等效,而不是类型继承。Ballerina 中的类型系统基于集合论,因此,对于这个领域,类型等价比类型继承更有意义。
那么有人可以让我知道如何使用这个集合理论来实现“继承”的概念或类似的功能吗?我们如何重用函数/类变量等?有这样做的标准方法吗?如果有我可以参考的示例/博客,请分享。
https://v0-991.ballerina.io/learn/faq/#why-is-there-no-type-inheritance
如果我没记错的话,您是在尝试将 Java 等流行语言中的 OOP 概念映射到 Ballerina,对吗?虽然这样做很诱人,但这实际上可能会适得其反。与其尝试以面向对象的方式思考问题的解决方案并尝试在 Ballerina 中编写 OOP 风格的代码,不如花时间熟悉 Ballerina 提供的类型系统和其他构造并构建使用这些结构的解决方案。将通过实施芭蕾(BBEs)将是一个良好的开端。
话虽如此,我将尝试简要回答您提出的问题。Ballerina 类型系统是结构化的。在 Java 中,任何用户定义的类型都是一个对象,您可以使用继承来建立类型之间的关系。在 Ballerina 中,我们比较值的“形状”以检查它是否与特定类型兼容。每个值都有一个形状,类型是一组这样的形状。以下是该语言的2020R1 规范对此和子类型的说明:
类型表示一组形状。Ballerina 中的子类型是语义的:如果 S 表示的形状集是 T 表示的形状集的子集,则类型 S 是类型 T 的子类型。每个值都有一个对应的形状。形状特定于基本类型:如果两个值具有不同的基本类型,则它们具有不同的形状。
让我们举一个具体的例子,使用记录来进一步解释这一点。
type Person record {
string name;
int age;
};
type Student record {
string name;
int age;
string school;
};
public function main() {
Student st = {name: "John Doe", age: 18, school: "XYZ Academy"};
Person p = st; // this is a valid assignment
io:println(p);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我们可以安全地使用Person引用来操作Student值,因为Student保证值具有与Person值相同的字段。
该Student记录定义可以写成如下以及:
type Student record {
*Person; // this is a type reference
string school;
};
Run Code Online (Sandbox Code Playgroud)
引用上面给出的类型将指定记录中的所有字段复制到当前记录。虽然这可能看起来像继承,但事实并非如此。上面的定义等同于我们之前看到的原始定义。
在 Ballerina 中,代码是按模块组织的。类似于 Java 中的包,除了模块由函数、类型定义(例如,记录、对象)、服务、侦听器、常量等组成。虽然支持对象,但它只是另一种类型的值;不是代码的组织单位。函数是模块级别的构造,如果您打算在其他模块中重用它,则需要具有public访问修饰符。要调用函数,您需要导入模块并使用模块名称限定函数调用。例如,
int x = foo:barFunction();
Run Code Online (Sandbox Code Playgroud)
Ballerina 不允许跨模块共享变量。但是,您可以在模块中使用公共常量。例如,
public const PI = 3.14;
Run Code Online (Sandbox Code Playgroud)
希望这能解决问题。如果您对该语言的设计感兴趣,可以参考我之前提到的语言规范以及 James 的以下博客文章:
另请注意,0.991 是一个严重过时的版本。我建议查看当前版本(1.2.2)。