Class 朱莉娅:是不是

Class 朱莉娅:是不是,class,oop,struct,julia,Class,Oop,Struct,Julia,我正在和朱莉娅一起研究朱诺 我不知道Julia是否支持OOP 例如,C++有什么类似于类>代码> >代码>结构> /代码>? 如何用成员(如数据或函数)声明它?我不是该语言的专家,但我的理解是:是..和否 它具有类和结构的等价物,但是除了单个构造函数之外,这些对象上没有其他方法 在主流的面向对象语言中,如C++、java、python和Ruby,复合类型也有与它们相关联的命名函数,组合称为“对象”。在更纯粹的面向对象语言(如Python和Ruby)中,所有值都是对象,无论它们是否为复合对象。在不

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

我不知道Julia是否支持OOP

例如,C++有什么类似于<代码>类>代码> >代码>结构> /代码>?
如何用成员(如数据或函数)声明它?

我不是该语言的专家,但我的理解是:是..和否

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

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


我想在Julia用户组中提及这一有价值的对话。

对我来说,Julia不像一种传统的OO语言,我总是喜欢把Julia看作一种面向方法的语言,而不是面向对象的语言,这是因为如果你试图在Julia中创建一种封装数据和功能的结构,很快你就会陷入困境

如有疑问,请阅读文档

长话短说:

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(球、墙)。事实上,这没什么大不了的。您可以通过让一个类型具有另一个类型的字段来实现类似于继承的功能,而多重分派允许您编写函数,这些函数根据您提供给它们的对象执行不同的操作,这几乎类似于对象方法。真正的区别在于将函数和类型保存在文件中的位置。因此,您可以在Julia中使用一种准面向对象的风格,但它仍然与OOP语言有明显的不同。

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

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


< O>语言中的传统方法是朱丽亚函数的一个特例,其中只有基于第一个参数的调度。

< P>答案是朱丽亚更接近C而不是C++。因此,OOP仅限于c::struct而不是c++::类。因此,从严格意义上讲,它只是数据封装或数据结构或类型定制,而不是真正的OOP对象。

当我在Google
上搜索Julia是否支持OOP时
我得到了大量相关文章。他们没有帮助吗?真的吗?这个问题是我在谷歌上看到的第一个结果;)。在任何情况下,当你从Python或C++语言中获得它,并让它工作时,这是非常困难的。根据我自己的经验=)这可能看起来有点迂腐(我不想这么做!),在python中,您的函数
double()
将只是一个函数,而不是一个方法。细节:要点是,在Python中,您通常会定义x.double(),即object.Hmm的double方法,因此没有封装,也没有公共/受保护的访问。因此不可能是OOP,有趣的。(旁注——Python的部分方式也存在部分问题,但至少Python糟糕的默认性能使它远离大型系统,Julia让我担心)方法/函数是黑盒,所以它们是封装的。在模块级别上,可以通过在名称后面附加u、u、u、,而不是导出方法或使用闭包来实现公共/受保护。您的注释“方法是在类型定义之外定义的”是字面意思吗?在
结构的外部。。。结束
还是你的意思是隐喻性的“外部”?因为可以在
结构内部定义“内部方法”。。。结束
ball.check()和check(ball)之间的主要区别在于封装和公共/受保护的etc访问。我在另一篇评论中详细阐述了这一点。(而且“按约定访问”在出现紧急错误时从不坚持,但在没有设计正当性的情况下明确更改访问修饰符是我几乎从未见过有人这样做)是的,事实是