Юля: ООП или нет
Я работаю над Юноной с Джулией.
Я не знаю, поддерживает ли Юлия ООП или нет.
Например, есть ли что-то вроде 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, в которых диспетчеризация осуществляется только на основе первого аргумента.