继承和实现的明显区别

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

  有人在群里出了一道题:

  

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

时间: 2024-09-20 15:06:52

继承和实现的明显区别的相关文章

Unity3D普通类和继承自MonoBehaviour类的区别

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. Unity3D普通类和继承自MonoBehaviour类的区别.如果创建新的类时,使用的是在unity editor的project视图中右键,create javascript or c#方式,那么创建的类都是默认继承自MonoBehaviour, 生成后可以查看类文件,会发现c#类继承自Mo

javascript中类式继承和原型式继承的实现方法和区别

在所有面向对象的编程中,继承是一个重要的话题.一般说来,在设计类的时候,我们希望能减少重复性的代码,并且尽量弱化对象间的耦合(让一个类继承另一个类可能会导致二者产生强耦合).关于“解耦”是程序设计中另一个重要的话题,本篇重点来看看在javascript如何实现继承. 其它的面向对象程序设计语言都是通过关键字来解决继承的问题(比如extend或inherit等方式).但是javascript中并没有定义这种实现的机制,如果一个类需要继承另一个类,这个继承过程需要程序员自己通过编码来实现. 一.类式

实现Runnable接口和继承Thread类之间的区别

在Java语言中,我们都知道,有两种创建线程的方式,一中是使用Runnable接口,另一种是使用Thread类. public class DemoRunnable implements Runnable { public void run() { //Code } } //with a "new Thread(demoRunnable).start()" call public class DemoThread extends Thread { public DemoThread()

继承Activity与AppcompatActivity的区别

AppcompatActivity相对于Activity的主要的两点变化如下: 1:主界面带有toolbar的标题栏: 2,theme主题只能用android:theme=”@style/AppTheme (appTheme主题或者其子类),而不能用android:style. 否则会提示错误: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) w

C++公有继承

is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/article/details/9028189 公有继承强调的是is-a的关系,强调的是一种继承关系,而has-a强调的是一种从属关系. 继承的形式为:  class  derived:public  based 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的

WinForm中Component Class、User Control及Custom Control的区别和使用建议

reference: http://blog.csdn.net/redstonehe/article/details/1536549 .NET Framework 为您提供了开发和实现新控件的能力.除了常见的用户控件外,现在您会发现,您可以编写能执行自身绘图的自定义控件,甚至还可以通过继承扩展现有控件的功能.确定创建何种类型的控件可能会费一番功夫.本节重点介绍了各类可继承控件间的区别,同时提供关系到为项目选择的类型的注意事项. 1. Component Class Component Class

Effective C++ 34 区分接口继承和实现继承

public继承从根本上讲,有两部分:接口继承和实现继承.两者之前的区别很像函数声明与函数定义. 具体设计中,会呈现三种形式:derived class只继承成员函数的接口(纯虚函数):derived class同时继承函数的接口和实现,同时能够重写(override):derived class同时继承函数的接口和实现,但是不允许重写该函数. 1.只继承成员函数的接口(纯虚函数): 例如pure函数 2.同时继承函数的接口和实现,同时能够重写(override): 例如impure函数,为了避

C++ 虚基类 派生与继承

在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转原则”. 继承分为public继承,protect继承,private继承 public:父类中的public,protected成员到了派生类中属性不变. protected:父类中的public,protected成员到了派生类中,都变为protected成员. private:父类中的publ

S1:原型继承

一.基本性质 function obj(){ this.name1 = '可以被delete删除'; } obj.prototype.name2 = '不能被delete删除'; obj.prototype.name = '成功调用getName()方法'; obj.getName = function(){ console.log(this.prototype.name); } var o = new obj(); delete o.name1 //输出:'undefined', 成功删除属性