继承

继承继承是“是一种”的关系

基类表示一般性,派生类表示特殊性,特殊性是一般性的派生物

继承一个类时, 派生类继承基类的成员,但不继承构造函数和析构函数;

继承一个接口是一种契约。派生类同意实现接口的每个成员;而接口承诺不会发生变化。

继承不单是仅仅把成员放入一个类中的机制,例如时间戳,它是一种Stamp,而不是Time,所以应该继承自Stamp而包含一个Time

public class TimeStamp : Stamp

{

Time time;

#region override Stamp functions

        …

#endregion;

}

 

跨语言继承假定基类和派生类都遵循公共语言规范CLS(例如C#中大小写区分,vbnet则非。。。)

 

System.Object

System.ValueType继承自System.Object,System.ValueType重写了System.Object的成员,以实现值类型的语义

Object.Equals 方法

引用类型的Equals方法比较相等性。该方法的默认实现中,指向相同对象的引用是相等的,指向不同对象的引用则不相等(即使它们状态相同)

值类型的Equals方法已经被重写以比较两个值是否相等

Equals方法的四个原则:自反性(自己必等于自己), 对称性(obj1等于obj2,则obj2必等于obj1), 传递性(obj1等于obj2,obj2等于obj3,则obj1和obj3相等), 一致性(如果obj1.Equals(obj2)为true,则只要两个对象的状态没变化,obj1.Equals(obj2)始终必须为true)

 

Object.GetHashCode方法——以整数返回哈希代码,哈希代码相关数据应该保持不变,很多算法可以用于创建有效的和分布式的哈希代码,有些算法非常复杂,简单起见,仅返回一个唯一ID…Public override int GetHashCode(){return EmplID;}

 

Object.GetType方法——返回一个Type对象,该Type实例用来执行相关对象的反射。Type类的成员诸如GetMethods, GetFields和其他类似方法返回有关对象信息

 

Object.MemberwiseClone——返回一个对象的新实例, 它执行浅表复制。对象的复制是通过按位复制每个成员实现(两对象可能指向相同引用);它不能被重写

 

重写

virtual关键字表示可以在派生类中被重写,可应用于方法、属性、索引器、事件

override表示要重写基类的虚拟成员的意图;

virtual关键字传播到所有子孙

重写不是要么全有要么全无的条件。使用base可以在派生类中访问基类的public饿protected成员;使用base不能跳过类层次结构中的多个层次,诸如base.base.xxx是非法的

 

重载

重载要求不同的函数签名。派生类中函数可以被重载、重写或同时被重载和重写

 

扩展方法

被定义为静态类中的静态方法, 扩展方法参数的第一个单词必须是this, 后面跟着目标对象的类型, 该类型定义了该扩展方法可以在哪里应用

扩展方法也能应用于接口。

 

new修饰符

隐藏基类的特定成员

virtual成员 和override 成员是相关的,这对于多态性很重要。具有new修饰符的派生类成员和基类成员是不相关的

对于虚拟方法,编译器“喜欢”最底层的派生方法;用new修饰符重新定义的method在基类中不能被隐式调用,相反,和子孙类继承关系最近的方法被调用

虚拟方法在所有子孙类中都可重写。然而,new修饰符在层次结构的那一点上使该方法不再是虚拟的。除非同时使用new和virtual修饰符

 

抽象类

包含一个或多个抽象成员的类

注意:静态成员不能是抽象的

 

密封类

类层次结构中的终极节点

 

构造函数和析构函数

基类的构造函数和析构函数不被派生类继承。

如果基类没有默认构造函数,除非派生类调用基类的一个有析构造函数,否则会发生编译错误

 

接口

与继承并实现该接口的类型之间达成的协议。接口是不可变的。

接口不能实例化,必须被实现

 

接口和抽象类区别:

抽象类可以包含一些实现,接口完全没有

抽象类可以继承其他类和接口,接口只能继承其他接口

抽象类可以包含字段,接口没有状态

抽象类油构造函数和析构函数,接口都没有

抽象类可以被结构继承,抽象类不能被继承

实现接口

接口成员隐式的设为公共的,因为该类型中的实现也必须是公共的

重复的接口成员只需实现一次

显式接口成员实现

如果需要分别实现从多个接口继承的歧义成员可以使用显式接口实现。通常这些成员被合并成一个单独的实现;

如果接口和派生类性具有相同成员时,也可以使用显式接口实现。

要调用显式接口实现首先将类型强制转换为合适的接口

接口的再实现

实现了一个接口的派生类的子孙不能强制转换为该接口类型,只有直接实现一个接口的类型才能强制转换为该接口类型;然而,该类的子孙可以铜鼓欧服类型强制转换为该接口的类型

显式实现的接口成员在子孙类型中不能被重写。;入股偶需要替换一个集成的显式实现的成员的行为,子孙类型中重新实现该显式实现的接口类型

多态性

相关的类(相关表示与该类型相同或者是该类型的派生类型)

公共的方法

不同的行为

接口多态性

与正常的多态性相同,只不过用接口替换了抽象的类和方法

new修饰符和多态性

截断

强制类型转换

将派生类实例强制转换为基类类型总是安全的。派生类包含了基类的一切

将一个值类型强制转换为一个基本接口具有不同的语义——引发装箱操作,所以将创建一个不同实体,任何一个变化将不影响另一个

把基类对象强制转换为派生类对象将在运行时引发一个异常

类型运算符

is:类型相关则返回true,否则false

as:相关则返回相关类型的实例,否则返回null

属性继承

posted @ 2010-05-20 01:03  pursue  阅读(125)  评论(0)    收藏  举报