这章的书写感觉很普通,是些基础的认知知识。

其中一点的重要认知,泛型接口的好处(其实也是使用泛型的好处之一):编译时类型安全&处理值类型时减少装箱。

再说点书上没有的。本来这些知识我打算另外分类在C#基础里讲的,这里先单独表述下。

接口回调

其实我想不通为什么这本书不讲一下接口回调这个概念,我可不会相信接口回调只在java中用到。

到现在为止,我突然发现,很多编程的基础概念,于面向对象编程的语言来说,都是通用的,但是抱歉,在C#里(相关书籍)居然没有!但我相信你翻阅Java书籍就有很大几率看到这些概念的详尽解释。

还好我也学过Java。

直到现在,我鲜少在C#书籍中看到"接口回调"这一概念。这对于一开始就接触C#的初学者来说,如果很多编程基础概念不讲,真的很难理解一些对象的行为。

我开始怀疑C#书籍的编写者都是站在怎样的高度。

接口回调也是多态的体现。

首先用一段代码来示例接口回调:

接口IMyInterface1的代码如下:

namespace CATest101
{
interface IMyInterface1
{
void Method1();
}
}

类MyClass1,实现接口IMyInterface1,代码(省略命名空间)如下:

    public class MyClass1:IMyInterface1
{
public void Method1()
{
Console.WriteLine("MyClass1中的方法:Method1()");
}
}

Main方法中的代码(接口回调):

        static void Main(string[] args)
{
MyClass1 my = new MyClass1();
IMyInterface1 i = my;//声明接口类型指针指向MyClass1的实例对象
i.Method1();
Console.ReadLine();
}

输出:

如上图所示,接口变量i调用Method1方法,实际调用的是子类MyClass1中的Method1方法。

这就是接口回调。由接口回调会引出另一个类似概念:

向上转型

向上转型即是:父类引用指向子类对象,即类似Father f = new Child();的代码表述形式。

现假定父类子类都有自己的myMethod方法,

调用f.myMethod();如果父类中myMethod是虚方法,那么调用的是子类的myMethod(子类必须使用override重写的情况),如果父类的myMethod非虚方法,则f.myMethod将调用自己内部的myMethod方法。

设计模式中“简单工厂模式”就是利用的向上转型这个原理。

最后套用一句百科知识:

接口回调和向上转型是设计模式的解耦核心,可以说几乎所有的模式都是建立在这两者的应用之上的。

《CLR.via.C#第三版》第二部分第13章节 接口 读书笔记(七)的更多相关文章

  1. 《CLR.via.C#第三版》第二部分第12章节 泛型 读书笔记(六)

    终于讲到泛型了.当初看到这个书名,最想看的就是作者对泛型,委托,反射这些概念的理解.很多人对泛型的理解停留在泛型集合上,刚开始我也是,随着项目越做越多,对待泛型的认识也越来越深刻. 泛型的概念:泛型是 ...

  2. 精通正则表达式(第三版)——Mastering Regular Expressions,3rd Edition——读书笔记1

    基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([0 ...

  3. Java 线程第三版 第八章 Thread与Collection Class 读书笔记

        JDK1.2引入最有争议性的改变是将集合类默觉得不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: j ...

  4. 精通正则表达式(第三版)—Mastering Regular Expressions,3rd Edition—读书笔记2

    1.肯定断言:必须匹配一个字符 排除型字符组:匹配未列出字符的字符组 2.范围表示法——列出范围内所有的字符 大多数情况下,不会影响执行速度.但是,某些实现方式不能完全优化字符组.所以,最好是有范围表 ...

  5. 《CLR.via.C#第三版》第一部分读书笔记(一)

    最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总 ...

  6. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

  7. 《CLR.via.C#第三版》第二部分第4,5章节读书笔记(二)

    这两章全是理论性的东西,我觉得不必过于钻牛角尖.理论这东西,只有在长期的实践中去慢慢领悟才会深刻.下面我只写些我认为重要的关键知识. (一)类型转换 知识点:向基类型的转换被认为是一种安全的隐式转换: ...

  8. 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)

    三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...

  9. 《CLR.via.C#第三版》第二部分第6,7章节读书笔记(三)

    第6章讲的是类型和成员基础 重要认知:虚方法 虚方法的设计原则:设计一个类型时,应尽量减少所定义的虚方法的数量. 首先,调用虚方法的速度比调用非虚方法慢. 其次,JIT编译器不能内嵌虚方法,这进一步影 ...

随机推荐

  1. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  2. racket

    let 和 let* 区别 ``` racket // 这是对的 (let* ([x (random 4)][o (random 4)] [diff (number->string (abs ( ...

  3. 电脑只有网页打不开,QQ和其他软件都能用

    应该就是浏览器设置代理服务器的问题 1.打开浏览器->找到工具->internet选项->链接->局域网设置 将代理服务器下面勾去掉

  4. MOD

    题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2318 ///这是哈理工校 ...

  5. win下安装jdk7后,修改环境变量无法改为jdk6的问题

    jdk的安装包,现在的策略改变了,不再帮你设置环境变量,而是直接把java.exe,javaw.exe,javaws.exe直接拷贝到了system32下. 删掉这3个,path就生效了!

  6. 如何在EF中实现left join(左联接)查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  7. Xcode 8 Simulator Stop Logging too much info

    按照以下内容设置即可:

  8. ehcache注解全面解析---打酱油的日子

    通过ehcache以编程方式使用缓存: 跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去.这种方式完全是通过代码的 ...

  9. BZOJ 2152 & 点分治

    Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...

  10. 图论 - 寻找fly真迹

    一天fly正坐在课堂上发呆,突然,他注意到了桌面上的一个字符串S1S2S3S4...Sn,这个字符串只由字符"a","b"和"c"构成.刚好 ...