今日はF#で練習することに決めました。興味深いものが1つ見つかりました。私は、C#およびF#で、しかしDAO(データアクセスオブジェクト)を使用して、かなり異なる挙動との両方のようなコードを提供しなければならない:F#クラスはプライベートメンバーとしてインターフェイスを実装しています、なぜですか?
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
1番目の違いは、非常に目に見えるものですが、C#を使用すると、メンバーを実装契約のためにpublic
と宣言する必要があります。
しかし、F#がプライベートメンバーとしてインターフェイスを実装できる理由は何ですか?センスは何ですか?
"* C#を使用すると、メンバーをパブリックとして宣言する必要があります*" [明示的インターフェイスの実装(C#プログラミングガイド)](https://msdn.microsoft.com/en-us/library/ms173157.aspx) –
@IvanStoevそれは別の方法です...あなたは明示的な実装を騙すことができます: 'IPoint2D pointObj = new Point2D();あなたはVStudio/VSCodeで試すかもしれません... –
F#は暗黙のインターフェイスの実装をサポートしていません。あなたはアップキャストする必要があります: 'let p = firstPoint:> IPoint2D in pX' – krontogiannis