作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我派生出一个类型 B
来自基类 A
.A
实现 IDisposable
明确的,但我必须在 B
中进行额外的清理,所以我实现了IDisposable
在 B
:
interface IDisposable with
member i.Dispose() =
// ... additional work
base.Dispose() // <- want to do but cannot
(base :> IDisposable).Dispose()
Unexpected symbol ':>' in expression. Expected '.' or other token.
(i :> IDisposable).Dispose()
StackOverflowException
在运行时 - 那么我该怎么做呢?抱歉,以前从来没有遇到过这样的事情……
最佳答案
您最好将清理逻辑放在虚拟方法中并实现 IDisposable
只有一次。
type A() =
abstract Close : unit -> unit
default __.Close() =
printfn "Cleaning up A"
interface System.IDisposable with
member this.Dispose() = this.Close()
type B() =
inherit A()
override __.Close() =
printfn "Cleaning up B"
base.Close()
protected
访问修饰符,可以使用签名文件制作
Close
非公开(或标记为
internal
)。
base
关键字只能用于成员(member)访问,不能单独使用。这就是为什么
base :> IDisposable
不起作用。
Dispose
只调用公众
Close
方法。所以你可以重新实现
IDisposable
并调用
base.Close()
反而。
IDisposable
的可继承类应该为子类“插入”处理提供一种方式。这通常通过提供
protected virtual Dispose(disposing)
来完成。从
Dispose()
调用的重载.无论出于何种原因,
DuplexClientBase
不遵循这个约定。鉴于
Dispose
可能被认为是不必要的。只转发到
Close
.
关于inheritance - 在 F# 中调用基类显式接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568024/
我是一名优秀的程序员,十分优秀!