Юля: ООП или нет

Я работаю над Юноной с Джулией.

Я не знаю, поддерживает ли Юлия ООП или нет.

Например, есть ли что-то вроде class или struct из c++?

Как объявить это с членами, такими как данные или функция?

Ответы

Ответ 1

Если есть сомнения, прочитайте документацию...

https://docs.julialang.org/en/v1/manual/types/#Composite-Types-1

Короче говоря:

struct MyType
    a::Int64
    b::Float64
end

x = MyType(3, 4)

x.a

ОБНОВЛЕНИЕ: методы определены вне определения типа, например

function double(x::MyType)
    x.a *= 2
end

Методы не живут внутри типа, как, например, в C++ или Python. Это позволяет одной из ключевых функций Julia, множественной диспетчеризации, работать также с пользовательскими типами, которые находятся на том же уровне, что и системные типы.

Ответ 2

Юлия не объектно-ориентирована в полном смысле, потому что вы не можете прикрепить методы к объектам Джулии ( "типы" ). Однако типы действительно очень похожи на объекты. Однако, поскольку у них нет собственных связанных методов и нет наследования, сами объекты не выполняют действия. Вместо этого у вас есть функции, которые действуют на объекты.

Разница заключается в ball.checkCollision() vs checkCollision (ball, Walls). На самом деле это не такая уж большая сделка. Вы можете сделать что-то вроде наследования, имея тип, который имеет поле другого типа, а множественная отправка позволяет писать функции, которые делают разные вещи на основе объектов, которые вы им даете, которые могут быть почти как объектные методы. Реальная разница заключается в том, где вы сохраняете функцию и типы в файле. Таким образом, вы можете сделать своего рода квази-объектно-ориентированный стиль в Julia, но он все еще отличается от языков OOP.

Ответ 3

Я хотел бы упомянуть этот достойный разговор в группе пользователей Julia Julia и объектно-ориентированное программирование.
Для меня Julia не похожа на обычный язык OO, и мне всегда нравится думать о Julia, как о ориентированном на метод языке, который имеет Object Oriented, потому что if вы пытаетесь создать структуру инкапсулированных данных и функциональности в Юлии, вскоре вы столкнетесь с проблемами.

Ответ 4

Ответ заключается в том, что Джулия ближе к c, чем c++. Таким образом, ООП ограничена в Юлии, имеющей только c :: struct, а не c++ :: class. Следовательно, это просто инкапсуляция данных или структура данных или настройка типов, а не истинные объекты ООП в строгом смысле.

Ответ 5

Я не эксперт по языку, но мое понимание: Да.. и нет.

Он имеет эквивалент классов и структур, однако на этих объектах, отличных от одного конструктора, нет методов.

В основных объектно-ориентированных языках, таких как С++, Java, Python и Ruby, составные типы также имеют именованные функции, связанные с ними, и комбинация называется "объектом". В более чистых объектно-ориентированных языках, таких как Python и Ruby, все значения являются объектами, являются ли они композитами или нет. В менее чистых объектно-ориентированных языках, включая С++ и Java, некоторые значения, такие как целые числа и значения с плавающей запятой, не являются объектами, а экземпляры определяемых пользователем составных типов являются истинными объектами со связанными методами. В Julia все значения являются объектами, но функции не связаны с объектами, на которых они работают. Это необходимо, поскольку Джулия выбирает, какой метод функции использовать для множественной отправки, что означает, что типы всех аргументов функций учитываются при выборе метода, а не только в первом (см. Методы для получения дополнительной информации о методах и отправке). Таким образом, было бы неуместно, чтобы функции "принадлежали" только к их первому аргументу. Организация методов в функциональных объектах, а не называние мешков методов "внутри" каждого объекта, оказывается очень полезным аспектом дизайна языка.

Ответ 6

Да. Вы просто не можете наследовать от конкретных "классов" с полями, только от абстрактных. Это связано с тем, что макет памяти конкретной структуры в Julia является частью ее интерфейса, и возможность ее подкласса путем добавления полей нарушит принцип подстановки Лискова.

Однако функции с множественной диспетчеризацией являются строгим обобщением методов с одной диспетчеризацией и являются строго более полиморфными. Вам просто нужно определить их вне определения класса, потому что они могут "принадлежать" нескольким объектам.

Традиционные методы в языке OO - это особый случай функций Julia, в которых диспетчеризация осуществляется только на основе первого аргумента.