C# F类作为私有成员实现接口,为什么?

C# F类作为私有成员实现接口,为什么?,c#,inheritance,interface,f#,access-modifiers,C#,Inheritance,Interface,F#,Access Modifiers,我决定今天用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; } s

我决定今天用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,我必须声明成员是公共的,以执行合同

但是,为什么F允许作为私有成员实现接口?这是什么意思


F要求对象向上转换,以便直接访问它们的接口。设x=firstPoint:>IPoint2D.x

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

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
并非所有人都同意,但作为一项设计规则,对象不应被升级以直接访问其接口。这样做会增加代码耦合。如果编写的代码调用对象接口上的方法,那么在不更新所有调用场景的情况下,就无法轻松更改该对象类

如果界面是带有x、y、z的IPoint3D,并且您希望将其更改为IPoint2D,那么所有引用z的强制转换都必须更新,而不是像距离这样的界面使用者


我相信这个设计选择是为了与语言的其他部分保持一致,并在使用OOP时促进更松散的耦合。2014年有一个问题没有得到回答,要求隐式向上投射。

使用C,我必须声明成员是公开的,不是真的-@IvanStoev,只是另一种方式。。。您可以欺骗显式实现,如:IPoint2D pointObj=new Point2D;pointObj.X=2;您可以在VStudio/VSCode中尝试…F不支持隐式接口实现。您必须在p中向上投射:let p=firstPoint:>IPoint2D。X@krontogiannis我懂了。。。让点=新的点2D2,3让x=点:> iPosit2D.x,为什么F创建者不想包含隐式实现方式?我认为这是一个特性,而不是bug,因为它阻碍了面向对象的设计。