gpt4 book ai didi

inheritance - 在 F# 中调用基类显式接口(interface)方法

转载 作者:行者123 更新时间:2023-12-03 16:35:48 24 4
gpt4 key购买 nike

好的,我派生出一个类型 B来自基类 A .A实现 IDisposable明确的,但我必须在 B 中进行额外的清理,所以我实现了IDisposableB :

interface IDisposable with
member i.Dispose() =
// ... additional work
base.Dispose() // <- want to do but cannot

问题是:如何从基础访问 Dispose 方法?
(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()反而。

您可以在 C# 中拥有相同的场景。实现 IDisposable 的可继承类应该为子类“插入”处理提供一种方式。这通常通过提供 protected virtual Dispose(disposing) 来完成。从 Dispose() 调用的重载.无论出于何种原因, DuplexClientBase不遵循这个约定。鉴于 Dispose 可能被认为是不必要的。只转发到 Close .

关于inheritance - 在 F# 中调用基类显式接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com