Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于F#面向对象编程_F#_Oop - Fatal编程技术网

关于F#面向对象编程

关于F#面向对象编程,f#,oop,F#,Oop,我们在f#中创建类的方式存在着这种二分法,这让我非常困扰。我可以使用隐式格式或显式格式创建类。但是我想要的一些特性只能用于隐式格式,而有些特性只能用于显式格式 例如: 我不能在显式定义的类中使用let inline*(或let) 在隐式定义的类中定义不可变的public字段(而不是properties*)的唯一方法(据我所知)是val-bla:bla语法 但这里有冗余。因为我将得到相同的不可变数据的两个副本,一个私有,一个公共(因为在隐式模式中,构造函数参数在类存在的整个过程中都是持久的)

我们在f#中创建类的方式存在着这种二分法,这让我非常困扰。我可以使用隐式格式或显式格式创建类。但是我想要的一些特性只能用于隐式格式,而有些特性只能用于显式格式

例如:

  • 我不能在显式定义的类中使用
    let inline
    *(或
    let

  • 在隐式定义的类中定义不可变的public字段(而不是properties*)的唯一方法(据我所知)是
    val-bla:bla
    语法

    但这里有冗余。因为我将得到相同的不可变数据的两个副本,一个私有,一个公共(因为在隐式模式中,构造函数参数在类存在的整个过程中都是持久的)

  • (不太相关)需要使用属性来实现方法重载和字段的默认值是相当令人不快的

  • 有什么办法可以解决这个问题吗

    *出于性能原因

    编辑:事实证明我在这两点上都错了(感谢Ganesh Sittampalam和MichaelGG)

  • 虽然我不能在隐式和显式类定义中都使用
    let inline
    ,但我可以很好地使用
    member inline
    ,我假设它也可以这样做

  • 显然,对于最新的F#,不再有任何冗余,因为任何未在类主体中使用的参数都是构造函数的本地参数

  • 在下一个F#版本中


  • 对于
    let inline
    ,您可以通过将其移到类外,并在调用它时显式地从类的范围内传递所需的任何值来解决此问题。因为它是内联的,所以这样做不会造成性能损失。

    这可能没有帮助,但您可以使成员内联。“成员内联私有”可以正常工作。

    “出于性能原因”?不能说我喜欢那种声音;)它主要是与图形编程相关的数字运算。请参见此处:。您的问题没有暗示您正试图解决的问题。我假设你想在C++中模仿C++风格的面向对象编程。(如果您的答案不正确,请纠正我!)。但是为什么在函数式语言中需要这个呢?我想这是您正在处理的问题所特有的,如果您在这里详细介绍一下,这可能会很有趣。构造函数参数是否仍然保留在Beta1编译器中?我以为他们会在不需要的情况下删除它。@Ganesh Sittampalam:你在哪里读到的?他们如何决定是否需要他们?谢谢,确实有用。谢谢意味着我将决定使用显式语法。