Как реализовать наследование у балерины - PullRequest
3 голосов
/ 19 апреля 2020

Я могу увидеть следующее описание в документах Ballerina об эквивалентности типов и наследовании.

Ballerina основана на эквивалентности типов, а не на наследовании типов. Система типов в Ballerina основана на теории множеств, и, следовательно, эквивалентность типов имеет большее значение для этой области, чем наследование типов.

Так может кто-нибудь, пожалуйста, дайте мне знать, как эта теория множеств может использоваться для реализовать концепцию «наследования» или подобную функциональность? Как мы можем сделать повторное использование функций / переменных класса, et c? Есть ли стандартный способ сделать это? И, пожалуйста, поделитесь, если есть примеры / блоги, на которые я могу сослаться.

https://v0-991.ballerina.io/learn/faq/#why -is-там-нет-тип-наследование

Ответы [ 2 ]

6 голосов
/ 20 апреля 2020

Если я не ошибаюсь, вы пытаетесь сопоставить понятия 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).

3 голосов
/ 20 апреля 2020

Ballerina не поддерживает наследование реализации или наследование на основе классов, которое вы видите в языках OO, таких как Java. Это означает, что вы не можете наследовать код от типов в Ballerina (например, объекты Ballerina).

Термин наследование является перегруженным термином. Если вы хотите узнать больше о sybtyping в Ballerina, прочитайте ответ Пубуду. Это объясняет, как вы можете добиться наследования интерфейса в Ballerina. Вы также можете сопоставить его ответ с объектами Балерины.

...