gpt4 book ai didi

c# - F#类将接口(interface)实现为私有(private)成员,为什么?

转载 作者:行者123 更新时间:2023-11-30 21:46:21 25 4
gpt4 key购买 nike

我决定今天用 F# 练习,发现一件有趣的事。我将在 C# 和 F# 中提供类似的代码,但使用 DAO(数据访问对象)时的行为却截然不同:

C#版本:

interface IPoint2D
{
int X { get; set; }
int Y { get; set; }
}

class Point2D : IPoint2D
{
private int _x = 0;
private int _y = 0;

public int X { get { return _x; } set { _x = value; } }
public int Y { get { return _y; } set { _y = value; } }
}

F# 版本:

type IPoint2D =
abstract member X: int
abstract member Y: int

type Point2D(x: int, y: int) =
let _x = 0
let _y = 0

interface IPoint2D with
member this.X = x
member this.Y = y

第一个区别非常明显,即使用 C#,我必须将成员声明为 public 以实现契约。

但是,为什么 F# 允许将接口(interface)实现为私有(private)成员?有什么意义?

enter image description here

最佳答案

F# 要求对象向上转型,以便直接访问它们的接口(interface)。 让 x = (firstPoint :> IPoint2D).X

F# 确实支持函数参数的隐式接口(interface)转换。它过去需要泛型,但已在该语言的较新版本中进行了更新。

let Distance (a:IPoint2D) (b:IPoint2D) =
(a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)
|> float |> Math.Sqrt

let firstPoint = new Point2D(2, 3)
let secondPoint = new Point2D(4, 5)

let distance = Distance firstPoint secondPoint
printf "%f" distance

并非所有人都同意,但作为设计规则,不应向上转换对象以直接访问其接口(interface)。这样做会增加代码耦合。如果编写的代码调用对象接口(interface)上的方法,则在不更新所有调用对象的情况下无法轻松更改该对象类。

如果接口(interface)是带有 x、y、z 的 IPoint3D,而您想将其更改为 IPoint2D,那么必须更新所有引用 z 的转换,而不仅仅是像 Distance 这样的接口(interface)使用者。

我相信这种设计选择是为了与语言的其余部分保持一致,并在使用 OOP 时促进更松散的耦合。有一个 user voice feature request从 2014 年开始,请求隐式向上转换的请求没有得到答复。

关于c# - F#类将接口(interface)实现为私有(private)成员,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321002/

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