• 我看《我是谁?[C#]》


    这几天正在学习有关接口的知识,看到博客园期刊上刊登了一篇名为《我是谁?[C#]》的文章,作者用生动有趣的语言对接口进行了深入的分析,感觉非常不错。看完后也想发表一点自己的看法,但是没法在期刊上回复,就写在这儿了。

    接口是一个公开的约定,利用接口可以实现与未知的代码用一种通用的方法进行通信。接口定义了自己的成员却不提供任何实现,当然也无法被实例化。

    当一个类继承某个接口时,这个类就理所当然的有了实现接口所规定的全部成员的义务。至于这个类还能不能干点其他的事,接口非常开明,它可能在说“这些我不管,只要你能干完我要求的活就行。”,所以,从接口继承的类完全可以具有其他非常多的功能,而这一切甚至与接口没有关系,正如原文示例中的N()。

    再回到原文:
     有一个 interface ABC 包括了如下的方法 M()

    public interface ABC
    {
        
    void M();
    }

          另外有个类 Class1 继承了 ABC 并且拥有自己的方法 N()

    public class Class1 : ABC
    {
        
    public Class1() {}

        
    public void M()
        
    {
            Console.WriteLine("Now we are in Class1, using method which inherit from Interface ABC ");
        }

        
    public void N()
        
    {
            Console.WriteLine("Now we are in Class1, we used method which not inherit from Interface ABC ");
        }
    }

    看看M()到底属于谁,从Class1的代码看,毫无疑问,M()是Class1的一个公共方法,比较特殊的是,M()比较能干,它同时担负起了为ABC实现M()的义务。

    当我们声明:ABC t = new Class1(); 的时候,我们一定是想使用ABC的功能,而不是Class1,否则我想一定会改成这样的: Class1 t=new Class1(); 虽然我们确确实实new了一个Class1,但我们new出来的对象还同时是ABC,Class1只是在幕后为ABC做了实现而已,至于Class1还能做什么,我们根本无从得到。开明的ABC自然不会把Class1的功能全盘托出,否则你直接找Class1得了。

    事实上,我们完全可以让Class1的一个方法去实现ABC,而这个方法不必公开,Class1甚至可以拥有一个同名的方法M()去做自己的事情。看下面的代码:

     1public class Class1:ABC
     2{
     3    public void M()
     4    {
     5        Console.WriteLine("Now we are in Class1, But using method which not inherit from Interface ABC ");
     6    }

     7
     8    void ABC.M()
     9    {
    10        Console.WriteLine("Now we are in Class1, using method which inherit from Interface ABC ");
    11    }

    12
    13    public void N()
    14    {
    15        Console.WriteLine("Now we are in Class1, we used method which not inherit from Interface ABC ");
    16    }

    17}

    18

    现在再进行如下调用:

    1ABC t = new Class1();
    2t.M();

    可以想到的结果自然是:Now we are in Class1, using method which inherit from Interface ABC

    而如果调用改成:

     Class1 t2=new Class1();
    2t2.M();

    结果将会是:Now we are in Class1, But using method which not inherit from Interface ABC

    显然,编译器非常明晰的分清了实现ABC的M()与Class1自己的M()。现在反过来想一想,我们怎么能要求用ABC声明的t去实现N()呢。

  • 相关阅读:
    报表图片不显示的问题(一)
    数据库时区问题
    变色
    给div加滚动条,当内容超过它的范围的时候
    Apple Style Effect
    easyui发生重叠现象的原因
    mysql 获取字符串长度
    纯css的带下拉菜单的导航条
    jQuery验证控件jquery.validate.js使用说明+中文API
    background-position 用法详细介绍
  • 原文地址:https://www.cnblogs.com/chinadhf/p/300463.html
Copyright © 2020-2023  润新知