多个构造函数和属性

时间:2017-09-25 09:10:50

标签: f#

我的源代码出现了下一个错误:

  1. '名称'没有价值
  2. 您应该调用备用构造函数
  3. 然后,我如何在F#中下一堂课?

    type Person = class
        member val Name: string
        member val Age: int option = None
    
        new() = { Name = "Anonymous" }
        new(name) = { Name = name }
        new(name, age: int) = { Name = name; Age = age }
    
        static member Hello =
                printfn "Hello, %O" Name
        end
    

    修改

    根据这篇文章中的@ user2088029答案和Object initializer + property initializer (from C# to F#)中的@kvb答案,我创建了下一个源代码,我希望得到它。 问题是"人(姓名,年龄=年龄)"表示错误表示" 没有名为' Person'的可访问成员或对象构造函数。需要1个参数"。

    type Person(name) = 
        member this.Name: string = name
        member this.Age: int option = None //with get,set
    
        new() = Person("Anonymous")
        new(name, age: int) = Person(name, Age = age)
    
        member this.Hello =
            printfn "Hello, %O" this.Name
    

    用法:

    let person = Person("Alex", Option = Some 25)
    

2 个答案:

答案 0 :(得分:2)

type Person(name : string,age : int option) = 
   new() = Person("Anonymous")
   new(name) = Person(name,None)
   new(name, age: int) = Person(name, Some age)
   member this.Name : string       = name
   member this.Age : int option    = age

   member this.Hello() =
        printfn "Hello, %O" this.Name

我不完全确定你想做什么,F#不是我的第一语言,我可能不会写这样的代码(我个人不喜欢多个构造函数) )...但无论如何

主构造函数放在类型名称后面。 然后你不需要"课程"和"结束"

主构造函数做了2件事

I)它定义了一个用于创建新对象/值的静态方法

ii)它定义了类

的字段/属性

然后你有其他构造函数......

我假设您希望Name和Age成为Person类的实例方法?所以它们需要以对象变量为前缀,"这个"对OOers来说似乎是一个明智的名字。

你的静态方法不起作用,因为如果它是静态的,它没有变量来代表一个人,所以我把它实现为一个实例方法

我不太清楚为什么" class / end"构造存在,我怀疑它可能是因为你可以创建" struct / end"结构,这些没有构造函数,但我几乎从未见过" class / end"构造用于描述语法的教科书部分之外的任何地方。

答案 1 :(得分:2)

在修订后的代码段中,存在两个问题:

  • 您的Age属性是只读的,因此它没有setter
  • 构造函数中的名字和年龄的初始值设定项无效 - F#中有关构造函数外观的严格限制

您可以通过将Age转换为val get, set属性来修复前者,您可以使用(稍微有些奇怪的)语法来调用后者,然后调用基础构造函数,后跟额外的操作。以下作品:

type Person(name) = 
    member this.Name: string = name
    member val Age = None with get, set

    new() = Person("Anonymous")
    new(name, age: int) as this = Person(name) then this.Age <- Some age

    member this.Hello =
        printfn "Hello, %O" this.Name

也就是说,@ user2088029的解决方案使得两个参数的构造函数都是主要的更好,我推荐使用它!