习惯于用IDE生成接口方法了,右键点击"Implement Interface",生成所有的接口方法声明,还带个Region多方便啊.
今天看<<CLR Vir C#>>时才了解到自己是知其然不知其所有然啊.

实现接口方法很简单,新手估计也都会,但怎么理解这个过程,不见得所有人都知道

Base class
class Base : IDisposable

    IDisposable Members#region IDisposable Members
    public void Dispose()
    {
        Console.WriteLine("Base's Dispose");
    }
    #endregion
}

首先我们可以简单的认为Base类里有个Dispose()的方法.这个方法跟是不是IDisposable的成员,先理解为没有关系.当编译这个类的时候,编译器发现它实现了IDisposable接口,于是查找有没有跟其成员IDisposable.Dispose()同名,参数和返回类型完全匹配,并且是public的,如果找到就在IVMap里指向这个方法的入口(我猜的,这地方具体见http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true)如果没有就出个编译错误.

如果找到的方法前面有virtual关键字,编译器仍然认为是匹配的.如何没有virtual关键字,编译器默认的还会为其加上sealed.那么其子类是无法override的.如何想要override父类的Dispose()方法,最好是在Base中定义Dispose()时使用virtual.当然如果我们没有权利改写Base类,我们可以让其子类同样继承自IDisposable,然后改写方法.这点已经有很多人谈论过了,估计大家基本都明白.不了解的可以gongle it!

Derived
class Derived : Base, IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Derived's Dispose");
    }
}

现在问题来了,我们是真的改写了父类的Dispose()方法吗?
测试一下:
Base c = new Derived();
c.Dispose();
结果你可以发现输出的是: Base's Dispose.当时我觉得很奇怪,后来静下来想想原来可以这么理解.
就如我开始理解接口实现过程一样,对于上面的代码我们可以直接忽略接口的存在,等效如下

Remove Interface
class Base 

    public void Dispose()
    {
        Console.WriteLine("Base's Dispose");
    }
}

class Derived : Base 
{
    public void Dispose()
    {
        Console.WriteLine("Derived's Dispose");
    }
}

这样大家应该都知道为什么输出是Base's Dispose,如果不知道可以去查看 "今天你多态了吗"一文,说的很详细了.
回过来看我们刚才的代码,编译的时候有个警告:   'Program.Derived.Dispose()' hides inherited member 'Program.Base.Dispose()'. Use the new keyword if hiding was intended. 
是不是把Dispose()看成只是类的方法更容易理解呢.只是通过接口调用的时候指向了这个方法的入口而已.

我以为如下实现Derived类会更好些,不会让你产生误解,以为Derived  override了Base类的Dispose()方法

显示实现接口
class Derived : Base, IDisposable
{
    void IDisposable.Dispose()
    {
        Console.WriteLine("Derived's Dispose");
    }
}

对于如下代码不要期待能输出Derived's Dispose结果.当然如果CallDispose()传入的参数类型是IDisposable,就当我没说过
static void Main(string[] args)
{
    Derived c = new Derived();
    CallDispose(c);
}
private static void CallDispose(Base b)
{
    b.Dispose();
}

要不然你得这样
private static void CallDispose(Base b)
{
    ((IDispose))b.Dispose();
}
但是你会觉得很别扭.当然 CallDispose(Base b)定义成这样本身就是个不好的设计.

具体大家可以看看<<CLR Vir C#>>14章,我想对于你理解接口实现的整个过程会有莫大的帮助

转载于:https://www.cnblogs.com/anders06/archive/2007/06/12/780719.html

接口一个被我忽略的地方--接口重定向技术相关推荐

  1. 提供对外接口时,要注意的地方

    提供对外接口时,要注意的地方 本篇仅是个人经验的总结,以及自己的看法.欢迎指正和讨论. 在实际工作中,如果你提供的接口,需要被下游多个部门依赖.那么,在接口设计的时候就一定要考虑一个问题:如何在给其他 ...

  2. 一个通用的Json解析框架接口设计(一)-接口设计

    我们项目中可能会用到许多的json框架,Fastjson.jackson.Gson.orgjson.json-lib,其实现方式各不相同,接口Api就不一样,我们想换一个json框架改动的地方就会很多 ...

  3. java模拟使用接口,关于java:模拟一个类与模拟它的接口

    对于单元测试,我需要模拟几个依赖项.依赖项之一是实现接口的类: public class DataAccessImpl implements DataAccess { ... } 我需要设置一个这个类 ...

  4. 一个类可以实现多个接口但是只能实现一个类

    public class SpbmServiceImpl extends BasicServiceImpl implements ISpbmService,ISpbmDao {} 一个类可以实现多个接 ...

  5. [基础题] 5.(*)按如下要求编写Java应用程序:(1)编写一个用于表示战斗能力的接口Fightable,

    /*5.(*)按如下要求编写Java应用程序: (1)编写一个用于表示战斗能力的接口Fightable, 该接口包含:整型常量MAX: 方法void win(),用于描述战斗者获胜后的行为: 方法in ...

  6. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)

    接着上一篇的基础知识,今天俺们来学习一下: 面向对象 (万物皆对象) 三大特征(封装.继承.多态) 接口 接口 概述:接口是一种引用数据类型,是方法的'集合',接口的内部主要是定义方法,包含常量.抽象 ...

  7. ASM 判定一个类,实现了指定接口

    为什么80%的码农都做不了架构师?>>>    ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法. 通 ...

  8. 如何设计USB TYPE-C接口的显示器和电视机,形态三独立功能的双USB-C接口 +一个HDMI接口的显示器

    接着形态一跟形态二的讲述,大家对于tupe-c的显示器有了一定的了解, 接下来我们来讲一下第三种形态,独立功能的双USB-C接口 +一个HDMI接口的显示器. 这种显示器具有双USB-C接口,但是两个 ...

  9. 分享一个二维码生成的接口,简单好用

    一直收藏的一个自动生成二维码的接口,可以用于把支付地址等内容转成二维码显示. 接口地址:https://api.qrserver.com/v1/create-qr-code/?size=150x150 ...

最新文章

  1. 中文ocr识别数据集地址
  2. 再谈querySelector和querySelectorAll
  3. C/C++ 中的0长数组(柔性数组)
  4. 第二章 OpenResty(Nginx+Lua)开发入门
  5. L1-056 猜数字 (20 分)
  6. 华为nova 7 se鸿蒙,荣耀v40和华为Nova7Pro哪个好-参数对比-更值得入手
  7. java设置只有一行表格,为什么我的表格插入一行后 样式都变了?是因为没有设置css吗?如果在java函数中插入的td.innerHTML = input type='text'/,可以设置样...
  8. 家用无线路由器的相关设置
  9. intersection-over-union(IoU: 交并比)
  10. java图形用户界面设计
  11. 屏幕录像专家v2016破解版
  12. 弱监督学习总结(1)
  13. 微信小程序 添加分割线
  14. ArcGIS——地理配准操作
  15. 华三服务器启用cpu虚拟化,启动BIOS的虚拟化设置方法|开启CPU虚拟化支持
  16. 百度统计的使用技巧_SEO建议
  17. amazon - FileZilla 连接 amazon云服务器
  18. PHP接入微信官方支付(native·APIv3)
  19. 软件测试学习网站有哪些?
  20. 【软件技术基础】02

热门文章

  1. arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap
  2. Window10:不能建立到远程计算机的连接。你可能需要更改此连接的网络设置。
  3. 什么是SFP光模块?光模块知识介绍!
  4. [渝粤教育] 辽宁对外经贸学院 国际集装箱多式联运 参考 资料
  5. 【渝粤教育】国家开放大学2019年春季 8042-22T养殖业基础 参考试题
  6. 【渝粤教育】电大中专学前儿童科学教育 (14)作业 题库
  7. 【渝粤题库】陕西师范大学209011商业银行信贷管理Ⅱ 作业(专升本)
  8. BLE蓝牙和传统蓝牙的区别
  9. 32linux下安装mysql5.7_Linux系统下以RPM方式安装mysql-5.7.9
  10. centos 远程安装java程序_centos7远程服务器中redis的安装与java连接