【发布时间】:2015-10-02 02:35:49
【问题描述】:
我目前正在使用 F# 中的 Eto.Forms。我遇到的一个小烦恼是,当您在外部文件(XAML 或 JSON)中定义 GUI 对象(表单、面板、按钮等)并声明事件处理程序时,这些事件处理程序必须具有特定类型:
member public this.OnFirstButtonClicked (sender:Object, e:EventArgs) ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked (sender:Object, e:EventArgs) ->
MessageBox.Show(this, "Second button was clicked")
|> ignore
类型签名的重复让我很困扰。 (这两个函数实际上有很多重复,比如使用几乎没有变化的参数调用 MessageBox,但这只是一个测试项目。在实际项目中,我会为这两个按钮做一些不同的事情。)我'希望不必每次都重复这些函数的类型签名。看了this page at F Sharp For Fun and Profit之后,我想我可以这样做:
type EventHandler = (Object * EventArgs) -> unit
member public this.OnFirstButtonClicked : EventHandler ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked : EventHandler ->
MessageBox.Show(this, "Second button was clicked")
|> ignore
但是,当我尝试这个时,我发现在成员函数中,语法 实际上 的意思是“这个函数返回一个 EventHandler 函数”。我想说“这个成员函数是一个EventHandler函数”,我不知道该怎么做。
更新:自从写了上述问题后,我了解到我实际上不必指定事件处理函数参数的类型签名。以下将起作用:
member public this.OnFirstButtonClicked (sender, e) ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked (sender, e) ->
MessageBox.Show(this, "Second button was clicked")
|> ignore
但是,我真正的问题不是“我怎样才能使这些事件处理程序工作?”我真正的问题是,“我已经学会了如何指定一个不是类成员的函数的类型,但是对于一个是 一个班级的成员?”
【问题讨论】: