c# – 为什么要明确界面实现?

c# – 为什么要明确界面实现?,第1张

概述我最近实施了一个类: class TestClass : IDisposable{ RegistryKey m_key; public TestClass() { m_key = Registry.CurrentUser.OpenSubKey("Software", false); } public void Dispose() 我最近实施了一个类:
class TestClass : Idisposable{    RegistryKey m_key;    public TestClass()    {        m_key = Registry.CurrentUser.OpenSubKey("Software",false);    }    public voID dispose()    {        // m_key.dispose();        Idisposable disp = m_key;        disp.dispose();    }}

如果我取消了对dispose的直接调用,我得到错误CS0117(“’Microsoft.Win32.RegistryKey’不包含’dispose’的定义).一些Google搜索引导我到了this thread,在那里我学到了什么,所以我现在明白了它的机制. MSDN文档表明,作者更喜欢我调用Close()而不是dispose(),但不能解释为什么.

这个模式的目的是什么(我认为我在IO类中看到过)?鉴于这是类作者的故意决定,上面的代码有多糟糕(通过Idisposable界面调用dispose)?这不可能太糟糕 – 毕竟,使用声明会发生什么,对吧?

[编辑:1]将标题从“非公开”改为“明确”2)从我的代码中删除显式实现,意外地从实验中留下来]

解决方法 这被称为显式接口实现.在您的示例中,由于将dispose()方法定义为“voID Idisposable.dispose()”,因此您还将显式实现Idisposable接口.

这通常是为了避免碰撞而进行的.如果Microsoft曾经想要添加另一个dispose()方法,该方法对RegistryKey执行了其他 *** 作,除非他们使用该接口的显式实现,否则它们将无法进行.

这通常用通用IEnumerable< T>接口.它需要您也实现非通用接口IEnumerable.这两个接口中唯一的成员是GetEnumerator,通用的一个更有用,所以它通常实现如下:

public clas SomeClass : IEnumerable<SomeOtherClass>{    public IEnumerator<SomeOtherClass> GetEnumerator ()    {        ...    }    IEnumerator IEnumerable.GetEnumerator ()    {        return GetEnumerator ();    }}

这样当您调用SomeClass的GetEnumator方法的对象时,它将调用通用版本,因为另一个被明确实现,从而允许我们获得强类型的泛型允许.

参见Jesse liberty编程C#的第166-169页(我有第四版).

总结

以上是内存溢出为你收集整理的c# – 为什么要明确界面实现?全部内容,希望文章能够帮你解决c# – 为什么要明确界面实现?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存