Если я не ошибаюсь, вы пытаетесь сопоставить понятия OOP, найденные в популярных языках, таких как Java, с Балериной, верно? Хотя это заманчиво, это может быть контрпродуктивным усилием. Вместо того, чтобы пытаться придумать решение проблемы объектно-ориентированным способом и попытаться написать код OOP в Ballerina, было бы лучше потратить время на знакомство с системой типов и другими конструкциями, которые Ballerina предоставляет и создает до решения с использованием этих конструкций. Ballerina by examples (BBEs) было бы хорошим началом.
Сказав это, я постараюсь кратко ответить на вопросы, которые вы подняли. Система балеринского типа является структурной. В Java любой определенный пользователем тип является объектом, и вы используете наследование, чтобы установить sh отношения между типами. В Ballerina мы сравниваем «форму» значения, чтобы проверить, совместимо ли оно с конкретным типом. Каждое значение имеет форму, а тип представляет собой набор таких форм. Вот что говорит 2020R1 spe c языка относительно этого и подтипирования:
Тип обозначает набор форм. Подтип в Ballerina имеет семантическое значение c: тип S является подтипом типа T, если набор форм, обозначенный S, является подмножеством набора форм, обозначенных T. Каждое значение имеет соответствующую форму. Форма задается c для базового c типа: если два значения имеют разные типы базовых c, то они имеют разные формы.
Давайте рассмотрим конкретный пример с использованием записей для дальнейшего объясните это.
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
гарантированно будет иметь те же поля, что и Person
ценность.
Определение записи Student
также может быть записано следующим образом:
type Student record {
*Person; // this is a type reference
string school;
};
Ссылаясь на тип , как указано выше, копирует все поля в указанной записи в текущая запись. Хотя это может выглядеть как наследство, это не так. Вышеприведенное определение эквивалентно исходному определению, которое мы видели ранее.
В Ballerina код организован по модулям. Аналогичен пакетам в Java, за исключением того, что модуль состоит из функций, определений типов (например, записей, объектов), служб, прослушивателей, констант и т. Д. c. Хотя объекты поддерживаются, это просто другой тип значений; не единица организации для кода. Функции представляют собой конструкцию уровня модуля, и если вы собираетесь использовать ее в других модулях, она должна иметь модификатор доступа public
. Для вызова функции необходимо импортировать модуль и квалифицировать вызов функции именем модуля. например,
int x = foo:barFunction();
Совместное использование переменных между модулями в Ballerina недопустимо. Тем не менее, вы можете иметь publi c constants в модуле. Например,
public const PI = 3.14;
Надеюсь, это прояснит ситуацию. Если вас интересует дизайн языка, вы можете обратиться к языку spe c, о котором я упоминал ранее, и к следующим постам в блоге Джеймса:
Также обратите внимание, что 0.991 является сильно устаревшей версией. Я бы посоветовал взглянуть на текущую версию (1.2.2).