zoukankan      html  css  js  c++  java
  • 继承和实现的明显区别

      事情的起因是这样的。。。

      有人在群里出了一道题:

      

        struct Point
        {
            private int _x;
            private int _y;
    
            public Point(int x, int y)
            {
                _x = x;
                _y = y;
            }
    
            public void Change(int x, int y)
            {
                _x = x;
                _y = y;
            }
    
            public override string ToString()
            {
                return string.Format("x : {0}, y : {1}", _x, _y);
            }
        }
    
    
    
    
                var point = new Point(1, 2);
                var obj = (object)point;
                ((Point)obj).Change(2, 3);
                MessageBox.Show(obj.ToString());

      问输出结果是多少,当然是 : x : 1, y : 2,这里没有问题,因为并没有读取设置后的值。

        struct Point : IChange
        {
            private int _x;
            private int _y;
    
            public Point(int x, int y)
            {
                _x = x;
                _y = y;
            }
    
            public Point Change(int x, int y)
            {
                _x = x;
                _y = y;
                return this;
            }
    
            public override string ToString()
            {
                return string.Format("x : {0}, y : {1}", _x, _y);
            }
        }
    
                var point = new Point(1, 2);
                var obj = (object)point;
                ((Point)obj).Change(2, 3);
                MessageBox.Show(((Point)obj).Change(2, 3).ToString());

      这样肯定就是2,3了。

      然后,有人干了这样一件事:

        interface IChange
        {
            Point Change(int x, int y);
        }
    
        struct Point : IChange
        {
            private int _x;
            private int _y;
    
            public Point(int x, int y)
            {
                _x = x;
                _y = y;
            }
    
            public Point Change(int x, int y)
            {
                _x = x;
                _y = y;
                return this;
            }
    
            public override string ToString()
            {
                return string.Format("x : {0}, y : {1}", _x, _y);
            }
        }
    
                var point = new Point(1, 2);
                var obj = (object)point;
                ((IChange)obj).Change(2, 3);
                MessageBox.Show(obj.ToString());

      实在是,我看到了结果是2,3才想起来,interface是引用类型的,而实现接口并不是继承,话说结构体也不能继承,而这里很明显区分出来的,实现只是实现了接口的方法,而具体是引用还是值类型并没有关系,除了实现了定义的指定方法外,就没有任何关系了,从这个场景也可以看出来,里氏替换并不适合实现接口的不同的类,虽然编译可能是正确的,但结果可能是迥异的。

      至于确定interface是引用类型,可以通过VS自带命令行工具打开ildasm查看编译好的IL代码查看。

  • 相关阅读:
    ios后台运行
    关于CRM2011插件注册更改记录状态的消息
    Microsoft Dynamics CRM 4.0字段审核跟踪功能
    CRM2011CTI集成项目
    win7下VS2010、IIS7配置常见问题收集
    CRM2011共享记录、更改状态、分派记录
    转载 [Dynamics CRM]錯誤代碼參考
    准备开发CRM2011的重要前提
    Aspx引用RDL
    CRM2011开发小技巧
  • 原文地址:https://www.cnblogs.com/saaav/p/4538934.html
Copyright © 2011-2022 走看看