MSDN上只说“接口只包含方法、委托或事件的签名。方法的实现是在实现接口的类中完成的”
这句话我怎么看也没看出下面这段程序是如何体现接口的,下面的代码是摘自“c# 入门经典第三版".书中说也可以把值类型封箱到一个接口类型。这接口类型又是什么类型?那个IMyinterface refType = valType1 我没法理解,难道可以象定义类的引用那样定义一个类型的引用,而这个类型是个接口?这都是什么意思啊?class Program
    {        interface IMyinterface
        {
        }        struct MyStruct : IMyinterface
        {
            public int Val;
        }
        static void Main(string[] args)
        {
            MyStruct valType1 = new MyStruct();            IMyinterface refType = valType1;
            MyStruct ValType2 = (MyStruct)refType;
        }
    }

解决方案 »

  1.   

    MyStruct继承了接口IMyinterface但IMyinterface里没有要实现的方法,所以这样就行。
      IMyinterface refType = valType1;
    IMyinterface 是refType的父类,这样表示当然也行啊
      

  2.   

    谢谢,似乎明白点了。在我看来,interface 的定义就必须是:
    interface IMyInterface
    {
    成员列表
    }我没法理解为什么还能有东西 = IMyInterface. 通常对初学者机械的理解来说,一个类继承了接口,就会在里面写接口里定义的方法的代码。所以无法理解为什么会有: IMyInterface XXXX=某个引用或者值类型变量很多树立就是这么简单地说了一下接口的样子:interface Imyinterface {method1 } 
    Class something:Imyinterface {public void method 1(){do something}}
    这样看接口很好理解,但是那个 << 接口 XXX=某个引用>> 似乎和这个接口的常规定义完全不沾边啊。内给具体解释一下么。希望我的问题提清除了。
      

  3.   

    书中说也可以把值类型封箱到一个接口类型。一种泛化说法。也没错。.net下,所有都是继承自Object。都是类型。
      

  4.   

    比如interface I驾驶技能
    {
        void DoDrive();
    }class Man
    {
        public virtual void DoEat(Food f) { ... } 
        public virtual void DoSleep() { ... }
    }class 驾驶员 : Man, I驾驶技能
    {
        public void DoDrive() { ... }
    }调用:
    Man 张三 = new 驾驶员(); // 张三是一个驾驶员
    I驾驶技能 drv = 张三; // 驾驶员有驾驶技能
      

  5.   

    本帖最后由 caozhy 于 2011-04-03 09:42:09 编辑
      

  6.   

     IMyinterface refType = valType1;是不是写成   IMyinterface refType = valType1 as IMyinterface  ;更直观些?
      

  7.   

    比如说,接着#5楼的例子,假设我们还要说明“驾驶员”继承自“中国公民”,那么就没有办法去继承作为class的中国公民了。尽管每一次都要去实现interface的接口令人痛苦,我们也不得不让驾驶员去继承自 I中国公民 这个interface,然后逐一手工实现这个接口的所有属性和方法,而无法使用class继承。这是从实际编程的角度来说的,是说.net和java不支持多重继承的特性带来的副作用。从设计角度,class和interface都是一样的,都可以作为对象的分类来使用。甚至你在设计一个对象类的继承结构时,没有必要去搞清楚它的父类是class还是interface。在设计时它们的作用是一样的。但是在编程时稍有区别。除了interface没有去实现任何代码继承以外,interface还不具有继承特点,也就是说如果你希望子interface也具有父interface,必须重复声明。而class支持继承,即子类自动具有父类多具有的interface。
      

  8.   


    这显然多花费几百行汇编语句、CPU时间去做无用功。valType1本来就是一个IMyinterface对象,本来就是,而不需要转换。
      

  9.   

    代码  MyStruct valType1 = new MyStruct();  IMyinterface refType = valType1;
    它申明了两个变量,指向同一个对象。只不过这两个变量向编译器申明的类型是不同的而已。两个变量指向同一个对象,不存在任何“转换”操作,不应该额外去写什么as代码。
      

  10.   

    呵呵,习惯了,个人经常写一些控件,这些控件实现了不同的接口,在控件的父控件中遍历子控件的过程中, 多用 as 来确定不同的接口 因为确定控件时返回的是 Control 类型 用as转化是合适的这里直接定义了一个对象,确实是不需要 as 
      

  11.   

    假设控件x它继承自Control,那么我们可以直接写Control y=x;
    编译器可以正确地验证这个变量y的类型,并正确编译。反过来,假设x是Control,我们想让程序在运行时去转换类型(而不是编译器去验证类型)并赋值给变量y,那么这时候才需要写as转换或者强制类型转换之类的代码!
      

  12.   

    这位专家,谢谢你的回复, 真该早点来这里向大家学习。我特别看到您提到:"但是在编程时稍有区别。除了interface没有去实现任何代码继承以外,interface还不具有继承特点,也就是说如果你希望子interface也具有父interface,必须重复声明。而class支持继承,即子类自动具有父类多具有的interface。"我还没碰到过接口继承接口的例子,您能不能讲得具体点呢,如何做才是“希望子interface也具有父interface,必须重复声明”。 谢谢您花宝贵时间指导我。
      

  13.   


    这个么,希望楼主不要被误导了。interface不能被继承这个杜撰的观点或描述错误的观点不能记住。可以试试
    public interface IInterface1
    {
        void Test1();
    }public interface IInterface2 : IInterface1
    {
        void Test2();
    }
    又或是不想试,看看系统的定义即可。
    using System.Collections;
    using System.Runtime.CompilerServices;namespace System.Collections.Generic
    {
        // 摘要:
        //     公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代。
        //
        // 类型参数:
        //   T:
        //     要枚举的对象的类型。
        public interface IEnumerable<T> : IEnumerable
        {
            // 摘要:
            //     返回一个循环访问集合的枚举数。
            //
            // 返回结果:
            //     可用于循环访问集合的 System.Collections.Generic.IEnumerator<T>。
            IEnumerator<T> GetEnumerator();
        }
    }
    接口显然可以继承。但sp1234不会说错的,猜测sp1234说的是显示实现接口不能通过继承具有实现接口特性的意思吧。
      

  14.   

    一个人掏出一张中华人民共和国居民身份证,他就是中国公民,不管他是白人黑人...他掏出一张随便哪个国家的机动车行驶证,他就是驾驶员,不管他是中国人美国人...接口是个契约,继承一个接口表明对象遵循该契约...可以认为身份证是个接口,机动车行驶证也是接口...所以可以由接口识别对象,而不用去管对象的类型...具体在.NET中来说,对象实例可以被转换为继承链向下任一类型及接口,这就是“接口 XXX=某个引用”的原因...至于多根而是单根继承,我觉得对楼主来说过早了...他显然还没有理解这些概念的基础知识,sp1234的很多高论其实初学者是很难甚至无法消化的...
      

  15.   

    这里有有关接口的视频教程你参考下:http://book.duoe.net/soft/html/3243.html
    接口其实就是一个开放的类,给他加上个特别的出口。也就多了个出口,你可以直接从开放类出来,也可以从接口出来。而且接口可以实现多元化,比如IDataReader这个接口可以实现各种数据库的类型,Sql,Access等
      

  16.   

    呵呵、、大家都说的很对,面向对象是C#的独特。而多态有时面向对象的重点,建议大家从类的继承开始把枚举,结构、接口仔细研究一下。我这里有我的笔记大家看一下希望可以帮到大家!
     一、类的继承
      1、定义基类:基类的定义和普通的定义一样 在类中首先定义字段、属性、然后定义
         构造函数和一般函数
      2、定义派生类
      【访问修饰符】class 派生类名称:基类名称
        {
    程序代码
         }
    注意:
    派生类可以继承除私有成员外的其它所有基类成员, 包括数据的定义和方法
    也可以在基类基础上扩充新的成员
    继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类 
    一个类只能有一 个父类(基类)
     二、多态
    多态:通过一个类可以调用自己方法的重载或者派生类方法、属性和事
    件的成员就叫做多态性了。
         有以下几种实现多态性的方式。
    1.是通过重载实现多态性
    2.是通过继承实现多态性
    3.是通过抽象类实现多态性
    4.是通过接口实现多态性
      1.重写基类虚方法实现多态————虚方法的实现一定要是两个类继承关系
        基类和子类中的方法名称相同
        虚方法实在继承的基础上可以去在子类中重置虚方法,虚方法不能和static关键字一起出现
    在用虚方法去实现多态的时候在基类中
    [访问修饰符]override 返回值 虚方法名称(){    }
    调用:在外类中调用时 创建父类实例化可以调用基类中的成员
          创建子类实例化可以调用基类和子类的结果因为跨类调用
          当创建实例化时用向上赋值的实例化 (基类类名) 创建名=new (子类类名)
           这样的结果为子类的结果
           多态——————虚方法的创建
        虚方法实在继承的基础上可以去在子类中重置虚方法,虚方法不能和static关键字一起出现
     2.隐藏基类方法实现多态 使用new关键字来隐藏基类的方法,即使用一个完全不同的方法取代旧的方法。
     使用new方法在基类中方法声明不一定要用virtual关键字
    三、接口
         完全的抽象类(它只能包含抽象方法,而不能包含任何方法实现)
         通过关键字interface声明
         接口的名字必须以I开头,比如IStorable
    接口继承的语法:[访问修饰符]interface 接口类型[基类接口名]{     }
    接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。
    接口成员默认访问方式是public ,接口成员声明不能包含任何修饰符。
    接口成员不用被实现,只需要指定基本形式
    子类可以从一个基类和多个接口继承 
     五、枚举
     1.枚举类型是个被命名的一系列常量每个常量都赋了一个值 ,枚举类型默认用int类型
    2.用逗号分隔各个值. 假如你没有赋值,那么枚举类型的第一个值,将会是0,
    而且每个项的值将会递增. 你可以不用为所有的枚举项赋值
    定义:  
          struct  结构名
                {
                 //结构成员定义
               }
    与类不同,结构的实例化可以不使用new 运算符。
    例如:        enum jijie//定义枚举  
                枚举和类是同一等级的,可以写在类外也可以写在类外   类内一定要写在函数外
      六、结构
    结构是值类型,而类是引用类型
    结构不支持继承,但可以实现接口
    结构中不能为实例字段设初始值
    结构中不能声明无参实例构造函数
    结构中不允许声明析构函数
      

  17.   

    <button value="确定" />
      

  18.   

    <span style="color:#ccc">大家一起讨论,问题就不是问题</span>
      

  19.   

    MyStruct valType1 = new MyStruct();  IMyinterface refType = valType1;
    我怎么看是父类对象指向子类的引用