前几日回复了一个网友的帖子,是关于new和override修饰符的区别,初看时发现自己也甚为模糊,msdn上的描述甚至也不能令人完全明确其区别,但于使用上并无大碍。简单的描述:
virtual:虚方法。可从父类继承也可以子类实现自己的个性,也就是OO三大特性中的多态。调用那个函数属于运行时决定。
new:隐藏了父类的virtual方法,默认调用自身实现的方法,但是可以显示的指定调用父类方法。函数同名时的默认行为。
override:覆盖了父类的方法,只能调用自身的方法。
abstract:抽象方法(或者类),即本身不包含实现,非抽象子类必须override它。可以指定一个方法为abstract来强制子类去实现它。
overload:通过参数列表来确定调用同名方法而已,这个应该编译时就能确定的了。
Code
例如以上代码,override时,只能输出自身方法,而new时,可以使用父类类型调用其父方法。上面代码的结果为:
---------------------------------------------------------------
ba_c1: (overrided) C1.myF1 //override: 父类方法已被重写
c1_c1: (overrided) C1.myF1
ba_c2: Base.F1 //new: 可以显示调用父类方法
c2_c2: (new) C2.newF1
--------------------------------------------------------------------------
例如一个矢量图形显示模块中,定义了各种类型的MapObject,即数据是用MapObjectCollection来组织的,这是调用集合中每个元素的Draw方法时,则每个元素应该override父类的draw方法才能实现正确的绘制。
------------------------------
另一则,关于接口,Interface,曾经有位同事为我接口在哪(在内存中占据何处),接口只是一种规约,协议(编译器可以理解它),怎么可能有实例呢?所以接口也不可能有构造函数,如果有那就是具体对象和具体类了。它好比规定一些对象应该具有那些属性,哪些行为,而协议何来数据,没有数据又怎么可能在内存中占据位置呢?指定了接口来声明一个对象,相当于就可以确定你想调用这个对象的哪一个方法或者成员变量。曾经很久以前看过一篇“我是谁”的关于接口的帖子,还引用了成龙的电影也是令人很.....,一个对象是什么取决于你用那个类的构造函数构造了它,和你用什么类型的声明或者什么类型的指针并没有关系。例如句柄也是指针,它指向的实际的结构,但操作系统为了封装数据,把它强转为了指向一个空结构的指针。一个对象和它的父类的关系是“is a”。和接口的关系是“满足”或者“符合”,你可以指针类型转换为别的类型,但是它是什么取决于new 后面的那个构造函数。