namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {           
            Ic ik = new b();
            ik.show();            ik = new a();
            ik.k = 123;            b mb = new b();
            mb.showD();
            
            
            Console.ReadKey();        }
        class a : Ic
        {
            public int k { get; set; }
            public void show() 
            {
                Console.Write("a show\n");
            }
        }
        class b :d,Ic
        {
           public int k{get;set;}
            public override void show2() 
            {
                Console.Write("b show2\n");
            }
            public void show()
            {
                Console.Write("b show\n");
            }
        }
        interface Ic
        {
            void show();
            int k { get; set; }
            
        }
        abstract class d 
        {
            public abstract void show2();
            
            public void showD()
            {
                Console.WriteLine("d show fun=showD");
            }
        }    }
}最近用到接口了就仔细的看了一下,感觉挺方便,但是还有一些迷茫的地方:1、 Ic ik = new b();为啥要这样写呢?b是一个类,Ic是一个接口,将一个类直接实例化到一个接口上?
因为后面还可以这样写,ik=new a();访问的时候是不是通过接口只能看到接口指定的几个方法或者属性?2、用接口是不是就为了将两个不同的类,相同的方法、属性联系起来?

解决方案 »

  1.   

    你的两个问题是相关联的,仔细辨别,其实它们显然是“瞎掰”。假设你写代码b ik = new b();那么变量ik也可以调用任何接口Ic上定义的方法或者属性,所以不存在说ik定义为类型b于是就“不能联系”起形同的方法、属性的问题。所以这个担心是完全多余的。其实首先,你可以认为这里是“个人爱好”使然。不要愤青地以为只有老师让你背诵的模式条款才是唯一正确的。真正正确的东西仅仅是你自己亲手写下并且“长年累月都能维系其跑通状态”的测试,而不是什么老师的教科书。假设有一整套代码它就是针对“振动器”做测试的,后来你发展了一套手机系统而且运行地很好,再后来你发现手机原来也可以作为振动器,这时候就需要临时把手机多态地用到原来针对振动器的测试中去,这时候只要改变一点点定义就行了。而假设你的手机定义是从“通讯器材”继承的子类,像.net和java这种悲催的编程语言不能像很多优秀的面向对象编程语言(例如eiffel语言)一样支持多重继承,你就只好用比较空洞的接口了。
      

  2.   

    所以不是说为了显示“我会用接口呀”这样的角度而写Ic ik = new b();。如果没有必要在此使用Ic,我觉得也不必将ik定义为Ic。因为你定义为类型b,它“就是Ic”,变量b就能直接用于Ic的多态调用中,而定义为b显然比定义为Ic功能更强。
      

  3.   

    有一种情况是需要这样用的,如下:
    Ic ik=null;if(条件=="a")
    {
     ik=new a();
    }else
    {
     ik=new b();
    }ik.功能();//这样做我不就能可以判定使用了么?
    ik.功能2();a类还是a类,b类还是b类,除了这样的方法,还能怎么来做这样的事情呢?(不考虑反射)
      

  4.   


    我现在是在做公司做码农,说实话,现在公司人做的程序,没有什么设计模式可言,全部的复制粘贴,所以我就想学一下,看看能不能用上来,艺多不压身么!就是设计模式不用在编程上面,以后我要是当了公司卫生部部长啥的,扫个地用一下设计模式不也能提高一下工作效率么?
    关于多重继承,具体的我不熟,但是我感觉java和。net对他进行弃用是有自己的道理,大道理不知道,但是我感觉用接口也实现了一部分的多重继承的功能,要学习的东西还很多,任重道远啊!
      

  5.   

    以前没用过,光书本上学了,看了跟帖顿时感觉更混乱了!Mark
      

  6.   

    接口可以用来表示任何实现它的类,就像基类可以表示任何由它派生出的类一样。
    这样式有好处的。比如一个函数int somefunc(ImyInterface obj)
    {
       ...
    }这个函数里面obj只使用了ImyInterface里定义的功能,就可以这样声明,这样,所以实现了ImyInterface的类的实例都可以当参数,这个函数就不用关心这些参数到底是什么类型了。非常方便!