繁体   English   中英

朱莉娅:OOP 与否

[英]Julia: OOP or not

我正在和朱莉娅一起研究朱诺。

我不知道 Julia 是否支持 OOP。

例如,是否有类似 c++ 的classstructclass东西?

如何使用数据或函数等成员声明它?

如有疑问,请阅读文档...

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 的关键特性之一,多重分派,也可以与用户定义的类型一起使用,这些类型与系统定义的类型处于完全相同的级别。

Julia 并不是完全意义上的面向对象,因为您不能将方法附加到 Julia 的对象(“类型”)。 尽管这些类型看起来与对象非常相似。 但是,由于它们没有自己的关联方法并且没有继承,因此对象本身不执行操作。 相反,您拥有作用于对象的函数。

区别在于 ball.checkCollision() 与 checkCollision(ball,Walls)。 实际上,这没什么大不了的。 您可以通过让一个类型具有另一个类型的字段来实现类似继承,而多分派让您可以编写函数,根据您提供的对象执行不同的操作,这几乎就像对象方法一样。 真正的区别在于您将函数和类型保存在文件中的位置。 所以你可以在 Julia 中做一种准面向对象的风格,但它仍然与 OOP 语言有明显的不同。

我想在 Julia 用户组Julia 和 Object-Oriented Programming 中提及这个有价值的对话。
对我来说,Julia 不像传统的 OO 语言,我总是喜欢将 Julia 视为一种面向方法的语言,而不是面向对象的语言,这是因为如果您尝试在 Julia 中创建封装数据和功能结构,很快你就会陷入困境。

答案是 Julia 更接近 c 而不是 c++。 因此,OOP 在 Julia 中受到限制,只有 c::struct 而不是 c++::class。 因此,严格来说,它只是数据封装或数据结构或类型的定制,而不是真正的 OOP 对象。

是的。 您不能从具有字段的具体“类”继承,只能从抽象类继承。 这是因为 Julia 中具体结构的内存布局是其接口的一部分,并且能够通过添加字段对其进行子类化会破坏 Liskov 替换原则。

但是,具有多重分派的函数是具有单一分派的方法的严格泛化,并且更加多态。 您只需要在类定义之外定义它们,因为它们可以“属于”多个对象。

OO 语言中的传统方法是 Julia 函数的一个特例,您只能根据第一个参数进行调度。

我不是这门语言的专家,但我的理解是:是的……也不是。

它具有类和结构的等价物,但是除了单个构造函数之外,这些对象上没有任何方法。

在主流的面向对象语言中,如 C++、Java、Python 和 Ruby,复合类型也有与之关联的命名函数,这种组合称为“对象”。 在更纯粹的面向对象语言中,例如 Python 和 Ruby,所有值都是对象,无论它们是否复合。 在不太纯的面向对象语言中,包括 C++ 和 Java,一些值,例如整数和浮点值,不是对象,而用户定义的复合类型的实例是具有关联方法的真正对象。 在 Julia 中,所有值都是对象,但函数并不与它们操作的对象捆绑在一起。 这是必要的,因为 Julia 选择通过多个分派使用函数的哪个方法,这意味着在选择方法时会考虑函数的所有参数的类型,而不仅仅是第一个(有关方法和分派的更多信息,请参阅方法)。 因此,函数只“属于”它们的第一个参数是不合适的。 将方法组织成函数对象而不是在每个对象“内部”命名方法包最终成为语言设计的一个非常有益的方面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM