gpt4 book ai didi

朱利安 : Enforcing interfaces on Abstract Types

转载 作者:行者123 更新时间:2023-12-01 13:14:40 26 4
gpt4 key购买 nike

我一直在尝试了解 Julialang 的类型系统但是一些设计方面仍然让我感到困惑。我希望有人能澄清一下。

所以这里的问题是关于抽象类型及其具体实现。从我understand Julia抽象类型不会对其具体实现施加任何约束。因此,不能保证适用于 Abstract 类型的方法将适用于该类型的具体实现。

我知道 Julia 不使用类或遵循继承。但我只是想避免在我的代码中产生各种错误。如果有不同的设计范式,那么有人可以回答下面的问题 2。

所以我有2个问题。

  • 这仍然是语言的工作方式吗?只是为了确认自博客文章以来没有任何变化。
  • 用户如何围绕这个看似漏洞来设计他们的软件?

  • 链接帖子中的问题示例:
    abstract type AbstractPerson end
    abstract type AbstractStudent <: AbstractPerson end
    abstract type AbstractTeacher <: AbstractPerson end

    struct Person <: AbstractPerson
    name::String
    end

    struct Student <: AbstractStudent
    name::String
    grade::Int
    hobby::String
    end

    struct MusicStudent <: AbstractStudent
    grade::Int
    end

    现在,如果我在抽象类型上创建一些方法。
    get_name(x::AbstractPerson) = x.name
    p1 = Person("elroy")
    get_name(p1)

    >"elroy"

    所以即使 MusicStudentAbstractPerson 的子类型, MusicStudent没有 name属性。这意味着观察到跟随行为。
    m1 = MusicStudent(10)
    get_name(m1)


    ERROR: type MusicStudent has no field name

    Stacktrace:
    [1] getproperty(::Any, ::Symbol) at ./sysimg.jl:18
    [2] get_name(::MusicStudent) at ./In[2]:1
    [3] top-level scope at In[13]:2

    所以这里的问题是 Julia允许我实例化类型变量 m1本质上是一个不完整的构造函数。当我尝试运行该功能时,它只会给我一个错误。

    所以这意味着如果我为抽象类型编写一个函数,我不能保证该类型的每个具体实现都具有相同的接口(interface)。这似乎会使代码变得非常脆弱,因为开发人员不知道哪些类型实现了哪些属性和方法。

    最佳答案

    这种行为不只是 Persons 实现中的一个 bug 吗?如果你真的希望行为没有异常(exception),你可以定义一个默认方法:

    julia> get_name(p::AbstractPerson) = try return p.name catch y return "" end
    get_name (generic function with 1 method)

    julia> m1 = MusicStudent(10)
    MusicStudent(10)

    julia> get_name(m1)
    ""

    我认为潜在的困难可能是在 Julia 中,您不能继承名为“name”的数据字段作为对象层次结构的一部分。这里有一个关于这个真正问题的很好的讨论(参见@forward 宏的提及):

    https://discourse.julialang.org/t/composition-and-inheritance-the-julian-way/11231

    关于朱利安 : Enforcing interfaces on Abstract Types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535455/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com