gpt4 book ai didi

F# 实现具有不同模板参数的接口(interface)

转载 作者:行者123 更新时间:2023-12-02 04:31:50 26 4
gpt4 key购买 nike

有这个代码:

type Point2D(x, y) =
member this.X with get() = x
member this.Y with get() = y

interface System.IEquatable<Point2D> with
member x.Equals point =
x.X = point.X
&& x.Y = point.Y

type Point3D(x, y, z) =
inherit Point2D(x, y)

member this.Z with get() = z

interface System.IEquatable<Point3D> with
member x.Equals point =
(x :> System.IEquatable<Point2D>).Equals point
&& x.Z = point.Z

http://take.ms/rjWlJ

我有编译时。 F# 不允许使用不同的模板参数实现相同的接口(interface)。但我想在派生类型中实现强类型等于。那么我应该用它做什么呢?

最佳答案

无能为力。这是一个有点遗憾的情况,因为当来自不同的 CLR 语言时,F# 可以很好地使用具有这种设计的类型。

我听到的解释是,拥有这样的功能并不被认为是重要的,部分原因是拥有这样的类/接口(interface)密集型设计并不被认为是惯用的(我同意这一点)。

因此,您的一个选择是在 C# 中实现这些类型。

另一种更惯用的方法是将它们实现为记录:

type Point2D = { x: float; y: float }

type Point3D = { x: float; y: float; z: float }
with
static member FromPoint2D (p: Point2D) = ...
member this.ToPoint2D () = ...

也许添加一个带有比较 2d 和 3d 函数的模块,该函数将为您封装转换。

关于F# 实现具有不同模板参数的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879730/

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