Hubfs 给出的答复

我在初学 F# 的时候, 对 C# 只能算是一知半解, 甚至可以说是个门外汉, 所以我一直没有机会去深刻的领会什么是 OOP, 连最基本的类都定义不好. 反倒是学习 F# 后, 经常需要到网络上搜索一些 C# 代码再转换, 这样才对 C# 有了一些了解…

我说我连类都定义不好, 这是个很尴尬的事实. 比如像 C# 的可视化设计器生成的代码那样, 新建一个 Form 修改窗口标题, 再加入一个Button. 这是再简单不过的例子了, 可是用 F# 该如何写呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 例子程序里展示了如何使用 FP 的风格建立窗体
let form =
let form = new Form(Text = "MyForm")
let b = new Button()
form.Controls.Add b
form

// 但是今天我们要讨论的是如何像 C# 那样继承自 Form 实现自己的类
// 第一种方法是我在 Simple101 中看到的
// 这是一种被称为详尽语法(Explicit syntax)
// 这是最中规中矩的定义方式 当然也最繁琐
type MyForm1 =
inherit Form
val b :Button
member t.InitializeComponent() =
t.Text <- "MyForm1"
t.Controls.Add t.b
new() as t =
{ b = new Button() }
then
t.InitializeComponent()

// 第二种是很常规的定义类的方法
// 被称为隐含语法(Implicit syntax)
// 隐含了什么? 我猜是隐含了构造函数吧
// 之前一直疑惑构造函数隐含了 那我怎么调用呢?
type MyForm2() =
inherit Form()
let b = new Button()
member t.InitializeComponent() =
t.Text <- "MyForm2"
t.Controls.Add b

// 感谢 Tomas Petricek
// 我一直不解的问题终于解开了 原来可以后接 as 语法来指向自己
type MyForm3() as t =
inherit Form()
let b = new Button()
do
t.Text <- "MyForm3"
t.Controls.Add b

// 感谢 Danny Asher
// 他的方法提醒了我基类的方法是可以直接调用的
type MyForm4() =
inherit Form()
let b = new Button()
do
base.Text <- "MyForm4"
base.Controls.Add b