如何在 Ballerina 中实现继承
How to implement inheritance in Ballerina
我可以在 Ballerina 文档中看到以下关于类型等价和继承的描述。
Ballerina is based on type equivalence, rather than type inheritance. The type system in Ballerina is based on set theory and, therefore, type equivalence has more meaning for this domain than type inheritance.
有人可以告诉我如何使用集合论来实现 'inheritance' 的概念或类似的功能吗?我们如何重新使用 functions/class 变量等?有这样做的标准方法吗?如果有examples/blogs我可以参考,请分享。
https://v0-991.ballerina.io/learn/faq/#why-is-there-no-type-inheritance
如果我没记错的话,您是在尝试将 Java 等流行语言中的 OOP 概念映射到 Ballerina,对吗?虽然这样做很诱人,但实际上可能适得其反。与其尝试以面向对象的方式思考问题的解决方案并尝试在 Ballerina 中编写 OOP 风格的代码,不如花时间熟悉 Ballerina 提供的类型系统和其他构造并构建使用这些构造的解决方案。 Ballerina by Examples (BBE) 将是一个很好的起点。
话虽如此,我将尝试简要回答您提出的问题。芭蕾舞女演员类型系统是结构性的。在 Java 中,任何用户定义的类型都是一个对象,您使用继承来建立类型之间的关系。在 Ballerina 中,我们比较值的 "shape" 以检查它是否与特定类型兼容。每个值都有一个形状,类型就是一组这样的形状。以下是该语言的 2020R1 spec 关于此和子类型的说明:
A type denotes a set of shapes. Subtyping in Ballerina is semantic: a type S is a subtype of type T if the set of shapes denoted by S is a subset of the set of shapes denoted by T. Every value has a corresponding shape. A shape is specific to a basic type: if two values have different basic types, then they have different shapes.
让我们以一个使用记录的具体例子来进一步解释这一点。
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);
}
在上面的代码片段中,我们可以安全地使用 Person
引用来操作 Student
值,因为 Student
值保证与 [=14] 具有相同的字段=] 值。
Student
记录定义也可以这样写:
type Student record {
*Person; // this is a type reference
string school;
};
上面给出的Referring a type将指定记录中的所有字段复制到当前记录。虽然这看起来像是继承,但它不是。上面的定义等同于我们之前看到的原始定义。
在 Ballerina 中,代码是按模块组织的。类似于 Java 中的包,除了模块由函数、类型定义(例如,记录、对象)、服务、侦听器、常量等组成。虽然支持对象,但它只是另一种类型的值;不是代码的组织单位。函数是模块级构造,如果您打算在其他模块中重用它,它需要具有 public
访问修饰符。要调用该函数,您需要导入模块并使用模块名称限定函数调用。例如,
int x = foo:barFunction();
Ballerina 不允许跨模块共享变量。但是,您可以在模块中包含 public constants。例如,
public const PI = 3.14;
希望这能解决问题。如果你对语言的设计感兴趣,可以参考我之前提到的语言规范和James的以下博文:
另外,请注意 0.991 是一个严重过时的版本。我建议您查看当前版本 (1.2.2)。
Ballerina 不支持您在 Java 等 OO 语言中看到的实现继承或基于 class 的继承。这意味着您不能从 Ballerina 中的类型(例如 Ballerina 对象)继承代码。
术语继承是一个重载的术语。如果您想了解更多关于 sybtyping
in Ballerina 的信息,请阅读 Pubudu 的回答。它解释了如何在 Ballerina 中实现接口继承。您也可以将他的答案映射到 Ballerina 对象。
我可以在 Ballerina 文档中看到以下关于类型等价和继承的描述。
Ballerina is based on type equivalence, rather than type inheritance. The type system in Ballerina is based on set theory and, therefore, type equivalence has more meaning for this domain than type inheritance.
有人可以告诉我如何使用集合论来实现 'inheritance' 的概念或类似的功能吗?我们如何重新使用 functions/class 变量等?有这样做的标准方法吗?如果有examples/blogs我可以参考,请分享。
https://v0-991.ballerina.io/learn/faq/#why-is-there-no-type-inheritance
如果我没记错的话,您是在尝试将 Java 等流行语言中的 OOP 概念映射到 Ballerina,对吗?虽然这样做很诱人,但实际上可能适得其反。与其尝试以面向对象的方式思考问题的解决方案并尝试在 Ballerina 中编写 OOP 风格的代码,不如花时间熟悉 Ballerina 提供的类型系统和其他构造并构建使用这些构造的解决方案。 Ballerina by Examples (BBE) 将是一个很好的起点。
话虽如此,我将尝试简要回答您提出的问题。芭蕾舞女演员类型系统是结构性的。在 Java 中,任何用户定义的类型都是一个对象,您使用继承来建立类型之间的关系。在 Ballerina 中,我们比较值的 "shape" 以检查它是否与特定类型兼容。每个值都有一个形状,类型就是一组这样的形状。以下是该语言的 2020R1 spec 关于此和子类型的说明:
A type denotes a set of shapes. Subtyping in Ballerina is semantic: a type S is a subtype of type T if the set of shapes denoted by S is a subset of the set of shapes denoted by T. Every value has a corresponding shape. A shape is specific to a basic type: if two values have different basic types, then they have different shapes.
让我们以一个使用记录的具体例子来进一步解释这一点。
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);
}
在上面的代码片段中,我们可以安全地使用 Person
引用来操作 Student
值,因为 Student
值保证与 [=14] 具有相同的字段=] 值。
Student
记录定义也可以这样写:
type Student record {
*Person; // this is a type reference
string school;
};
上面给出的Referring a type将指定记录中的所有字段复制到当前记录。虽然这看起来像是继承,但它不是。上面的定义等同于我们之前看到的原始定义。
在 Ballerina 中,代码是按模块组织的。类似于 Java 中的包,除了模块由函数、类型定义(例如,记录、对象)、服务、侦听器、常量等组成。虽然支持对象,但它只是另一种类型的值;不是代码的组织单位。函数是模块级构造,如果您打算在其他模块中重用它,它需要具有 public
访问修饰符。要调用该函数,您需要导入模块并使用模块名称限定函数调用。例如,
int x = foo:barFunction();
Ballerina 不允许跨模块共享变量。但是,您可以在模块中包含 public constants。例如,
public const PI = 3.14;
希望这能解决问题。如果你对语言的设计感兴趣,可以参考我之前提到的语言规范和James的以下博文:
另外,请注意 0.991 是一个严重过时的版本。我建议您查看当前版本 (1.2.2)。
Ballerina 不支持您在 Java 等 OO 语言中看到的实现继承或基于 class 的继承。这意味着您不能从 Ballerina 中的类型(例如 Ballerina 对象)继承代码。
术语继承是一个重载的术语。如果您想了解更多关于 sybtyping
in Ballerina 的信息,请阅读 Pubudu 的回答。它解释了如何在 Ballerina 中实现接口继承。您也可以将他的答案映射到 Ballerina 对象。