代码改变世界

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

2014-11-13 11:53  杭伟  阅读(1373)  评论(13编辑  收藏  举报

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

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

再说点书上没有的。本来这些知识我打算另外分类在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方法。

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

最后套用一句百科知识:

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