这是面向对象的基本概念
一般类/特殊类(或者说父类/子类)的定义:
如果类A的全部实例都是类B的实例,且类B具有不属于类A的实例,
那么:A是B的特殊类(子类),B是A的一般类(父类)String类型继承了IComparable类型,所以:
所有String类型的实例都是IComparable类型的实例

解决方案 »

  1.   

    如果不能的话,接口不就没用了...
    类型实现一个接口就是为了在需要这个接口的地方可以被使用,这个和把它当作基类使用是差不多的意思。c#不支持多继承,通过接口就可以定义跨继承关系的公共行为约定,无论是什么类型,实现了某个接口就可以被当作这个接口使用。
    把对象当作接口时,对象本身的类型并没有改变,不管把它当成什么,你调用它的GetType方法看到的都是它本来的类型。
      

  2.   

    GoF的设计模式和楼主的问题没有任何关系,
    并且GoF提出的东西根本不能算是设计模式,应该叫做:java编程36招鲜,
    要真的那种理论指导软件设计,那真是本末倒置
      

  3.   

    String类型继承了IComparable类型,所以:
    所有String类型的实例都是IComparable类型的实例。这就是接口的妙用。否则要接口干嘛?
      

  4.   

    变量原本可以引用任何对象的。只不过c#的编译器帮你检查一下(等号两边的变量的)类型兼容性而已。然后.net系统在运行时还可以动态检查类型兼容性。你在其它语言中,例如c、javascript之类的,那些引用变量可以胡乱引用任何类型对象,根本没有必要的安全保障。因此c#已经算是不错的了,可以帮你进行类型检查。
    “一个类对象为什么可以赋给一个接口”这个话显然是忘记了主语。这是把一个对象(s引用的对象)赋值给一个变量,而不是赋值给接口。
      

  5.   

    谢谢!结论好像是B是A的具体类(特殊类或子类)
    A是B的一般类(父类或基类)
      

  6.   

    打个比喻,在什么场合做什么事情。
    作为一个成功的人,他或许有着多重身份:父亲、领导、足球队队长、赛车手。
    当他在不同的场合的时候,是扮演着不同的身份,当他在家里的时候,只需要做出父亲的样子,作为父亲做应该做的。当在公司的时候,就得放弃父亲的角色,转而扮演领导的身份,执行不同的任务和工作。
    各个身份就好比各个接口(Interface),那个人就好比是一个实现了各个接口的一个类(Class),当你需要在特定场合执行某类相关操作的时候,直接切换成相应的身份(Interface)就行了。
    能理解吗?
      

  7.   


    谢谢 microtry 的回复
    结论好像是B是A的具体类(特殊类或子类)
    A是B的一般类(父类或基类)
      

  8.   


    谢谢yuwenge 的回复
    你的意思是说所有会咬人的东西都可以赋值给这个叫咬人的接口的变量吗???
    你的结论是更具继承的原理来的吗???
    如果是继承的原理,那么咬人的接口应该是基类,狗应该是子类可以这样理解你的意思吗???
      

  9.   


    谢谢 dongxinxi 的回复
    接口类型是实现类的一个特殊父类,那实现类必然就是子类了,那么子类赋给父类是否要通过显示·的转换呢???
      

  10.   

    GoF的设计模式和楼主的问题没有任何关系,
    并且GoF提出的东西根本不能算是设计模式,应该叫做:java编程36招鲜,
    要真的那种理论指导软件设计,那真是本末倒置

    To young to simpleString s="aaa"
    IComparable icomparable=s
    你的问题是为什么这个可以我帮你补充多一个问题,为什么要这样写?
      

  11.   

    当类型不兼容时,编译器会真的去查找“对象复制”的操作符定义并且调用它。我在另一个帖子中举出过一个“香蕉变成马”的例子。http://bbs.csdn.net/topics/360039451不过这个帖子中全都是关于兼容的类型的赋值问题,所以与这个香蕉和马的程序是不同的。
      

  12.   


    谢谢再次提醒,可能是我没有表达清楚,我再说一下
    String s="AAA”
    IComparable icomparable=s
    编辑器看到这句的时候,就正如你所说,会检查类型的是否兼容(对象的类型是否相同),实际上,这句话编辑器是能编译通过的,那也就是说等号左右两边的类型是一致的(或者说存在继承关系),刚好String类型是继承了IComparable接口的,我的问题是想知道类继承接口和类继承类的性质是一样的吗?
      

  13.   


    谢谢yuwenge 的回复
    你的意思是说所有会咬人的东西都可以赋值给这个叫咬人的接口的变量吗???
    你的结论是更具继承的原理来的吗???
    如果是继承的原理,那么咬人的接口应该是基类,狗应该是子类可以这样理解你的意思吗???
    这里就涉及到基类和接口的区别。
    基类可以有属性,可以有方法,且只能单继承。这是C#的定义。
    接口只能有方法,不能有属性,可以多继承。对应现实,我们可以认为,基类是某一类东西,是有实质存在的,所有有属性,比如“水果”,“动物”。你可以指着苹果说这是水果,指着猫说这是动物。
    接口是某一类动作的集合,凡事能完成这类动作的实例都实现了这个接口。狗可以咬人,猫可以咬人,羊不咬人,蚯蚓不咬人。他们都是动物(基类),但没有都继承咬人的接口。
      

  14.   

    LS的有口误,接口可以有属性,属性实际上就是方法,只是在VS中的样子看起来没有了方法的()
    这么说吧,假设class Child : Parent, ITest
    那么
    Child c = new Child();
    Parent p = c;
    ITest t = c;
    上面都成立,并且 p = c =it(引用的都是最上面的c对象)
    只是p只能看到Parent中定义的公共成员
    t只能看到ITest中定义的成员(属性或者方法,接口中所有成员不需要加public修饰,约定所有成员都是公共的)
    这所以这样,是由于编译器作了类型检查以保证类型安全
    因为C#是类型安全的面向对象语言,所以编译器要设计成这样
      

  15.   

    Parent p = c;
    面向对象其中的一条基本原则就是里氏替换原则(子类的实例能够替换任何其超类的实例)
    http://baike.baidu.com/view/1688346.htm?fr=aladdin