您的位置:首页 > 其它

override 和 new;virtual 、 abstract、interface 的区别

2012-08-06 02:40 337 查看
override 和 new 的区别

1.你从基类调用虚函数,就会不同。用override重写,会调用重写后的函数。用new重写,则仍调用基类的函数。

2.new 是“重写”的默认修饰符,若不显式的声明会默认添加new关键字,且会生成警告, 但不影响执行。

3.new和override都是重写基类方法 ,都只能重写 virtual、abstract、override修饰的function(), 不能是静态或非虚方法(因为先天逻辑上就矛盾了)

4.他们都可以实现对基类的隐藏,也都可以使用base来调用基类(直接父类) , 但是有区别:

①使用override来重写时, 基类必须是虚方法(virtual)声明的 , 而 new则不需要

②譬如:父亲和儿子都有钱包(方法), 爸爸的钱包是基类方法, 儿子的是重写方法 ; 儿子的钱包若是new进行重写的, 你调用谁的钱包就是谁的钱包(是分开独立的),若儿子钱包是override重写的, 你调用爸爸的钱包则也会调用到儿子的钱包;如是直接调用儿子钱包,不管是new或者override都不会 涉及到爸爸的钱包

;若要在儿子类当中调用爸爸的钱包 , 则需要用 base关键字来声明:“爸爸我需要钱”.

5.override相当于子类覆盖掉父类的方法 ,除非你显式的非要调用父类方法( base.function()) ; new相当于重新在子类当中写了一个名字一模一样的方法, 两者是不相关的

6.子类实例化会调用父类构造函数 用 :base()

virtual 、 abstract、interface 的区别

1.virtual是抽象出来的方法或字段 , 以便派生类 (子孙后代类) 来重写这个方法 , 但是需要 “{ }”大括号来声明下代码块 , 这点和 abstract不同

2.abstract是隐式的 virtual , 只允许在 abstract 类中声明 abstract 方法, 这和static类相类似(但abstract类中又不是必须全部声明为abstract 类型的方法) , 而 virtual则不受限制 ;就是说 abstract 比 virtual 定义上就严格很多

3.abstract 和 interface 都不能实例化 :一个是抽象出来的类 ,一个是抽象出来相同功能的接口 ;意味着一个是基于实体的( 动物有很多,人是动物,狗也是动物, 我们可以抽象出 animal类;人可以走路,狗也可以走路,我们可以抽象出来一个 “走路”方法的接口, 一个接口一般就定义专一功能, 否则可能造成接口污染)

4.interface定义也比较严格 :只包含方法声明,连“{ }”都不能有,成员可以出了方法之外还有 属性、事件、索引器; 不能有常量、字段、构造函数、析构函数、静态成员这几类

5. 接口可以实现多重继承, 类在C#中是不实现多重继承的; 可以将接口中的方法声明映射到abstract类中 ,让其子类来实现

6.还有很多 但是重点基本罗列了出来 , 其他没敲出来的都是一些常识性的 懒得敲了.......

注意下:属性和字段的区别:

属性本质上来说是个方法,但是在通过属性给内部字段赋值(set)可以加上自己的逻辑判断或限制等等,通过属性取值取值(get)当然也可以加一些跟你业务逻辑相关的code。总之是用属性是个好习惯,不要直接把字段暴露出来。get{reture xxx;}表示可读set{xxx = value;}表示可写

字段就是类内部用的.存储数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: