【发布时间】:2017-01-12 06:11:58
【问题描述】:
我今天决定用 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# 允许将接口实现为私有成员?有什么意义?
【问题讨论】:
-
"使用 C#,我必须将成员声明为 public" 不是 - Explicit Interface Implementation (C# Programming Guide)
-
@IvanStoev 这只是另一种方式...您可以欺骗显式实现,例如:
IPoint2D pointObj = new Point2D(); pointObj.X = 2;您可以在 VStudio/VSCode 中尝试... -
F# 不支持隐式接口实现。您将不得不向上转型:
let p = firstPoint :> IPoint2D in p.X -
@krontogiannis 我明白了...
let point = new Point2D(2, 3) let x = (point :> IPoint2D).X,为什么 F# 创建者不想包含implicit实现方式? -
我认为这是一个特性,而不是错误,因为它不鼓励面向对象的设计。
标签: c# inheritance interface f# access-modifiers