java吧 关注:1,234,220贴子:12,701,018
  • 16回复贴,共1

萌新问个C#问题关于接口的

只看楼主收藏回复

最近在看《CLR via C# 》,看到《接口》那一块儿,注意到俩细节:1.对象的接口方法是按照对象实际类型所实现的接口方法进行调用的;2.接口类型的变量可以调用该接口所定义的方法。可是在我看来,第二点中的接口类型的变量只要引用了一个实例以后,不就自动满足了第一点吗?那本来可以调用接口定义的方法直接就变成了那个对象类型所实现的接口方法了吧
于是我就自己写了个不大正规的接口测试
如上图所示,我将Ikun接口的方法定义了一个实现,j也满足第二点,但输出却依旧按照引用对象的类型所实现的方法走难道不严格按照EIMI来的话,以上两点输出完全就可以等同?


IP属地:浙江1楼2024-07-11 03:32回复
    一个变量,定义是什么,就不能改,定义是接口,它的定义就是接口,定义是具体实现类,它的定义就是具体实现类
    但是,在定义不能改的前提下,一个变量所引用的对象,是可以在代码中改动的,比如第某行代码让它引用一个对象,下面某行又让它引用另一个对象,只不过,它引用对象的类型要受到限制,必须是定义类型的具体实现的实例,也可以是实现类的子类的实例
    一个变量能不能点出来一个方法,看它定义是什么,如果它定义为一个类型,而实际引用了该类型的某个实现类的对象,前者没有某个方法,后者有某个方法,尽管这个变量实际引用的是后者的实例,但还是点不出来这个方法,可以定义另一个变量,把这个变量通过强转赋值给新变量,用新变量去点出实现类的方法
    如果一个变量的定义类型和实际引用的对象的实现类里面有共同方法签名的方法,但是方法体具体实现不同,变量点方法进行调用时,走的是哪个方法,优先看此时实际引用对象的实际实现类,如果实现类没有重写该方法,找其父类定义的方法,直到找到该变量的定义类型里面的方法


    IP属地:江苏来自iPhone客户端2楼2024-07-11 06:55
    收起回复
      先打好基础。接口实现分显式和隐式两种。接口的实现方法可以是虚的也可以是非虚的。


      IP属地:山西来自Android客户端3楼2024-07-11 08:59
      收起回复
        书里的意思是,d是IDisposable接口的变量,那它调用的就是接口定义的方法;但是按照之前所说,d这个变量引用了st这个对象,它的调用也可以看成是调用了实际类型st这个simpletype这个类所定义的方法实际操作起来更像是第二种。。。。
        不过按照Clr运行逻辑来看,接口方法隐式实现时,接口和派生类定义的方法实际是共用一个实现也就是公共方法。
        意思就是只要不是实现EIMI的话,默认就是隐式然后调用公共方法充当接口实现咯?



        IP属地:浙江来自Android客户端4楼2024-07-11 14:39
        收起回复
          方法能不能点出来看变量的定义类型,这个能不能点出来,编译期就可以一锤定论
          实际运行期,走哪个方法体,看引用的对象的实际类型,有些情况下这在编译期是无法预测的
          点出来看变量类型,走哪个方法体看运行期实际引用的对象类型


          IP属地:江苏来自iPhone客户端5楼2024-07-11 17:40
          收起回复