继承
什么是继承?
继承描述的是两个类之间的关系,通过继承可以允许一个类获得另一个类的所有代码,简单理解为:是一个什么
继承的好处
省去大多数重复的代码,提高代码复用性
多态,继承的对象的某个行为而具有多个不同表现形式的能力
语法结构
基类:包含公共的属性或者行为 派生类:继承关系使用冒号来表示,冒号后面为基类
c#中所有类都会默认继承Object类
复合
什么是复合
描述两个class间的关系,不同类之间包含与被包含的关系,简单理解为:有一个什么
复合的好处
解决代码复用的问题,复合的灵活度更高
完成对象间的依赖注入
protected,internal
protected
对外部私有且对派生类开放
internal
使用internal后相关代码只能在同一程序集或同一项目中使用
构造方法的继承
初始化对象时,基类的构造方法总是首先运行
基类的构造方法不会被继承,在派生类中需要重新定义
如果一个class中存在多个构造方法,其在处理类继承时面临多个构造方法选择的问题,默认会使用无参构造方法
在派生类中选择基类的构造方法
//使用base关键字,相当于进行了一次方法调用
//base中有参数选择带参数的构造方法,没有默认选择无参构造方法
public Manage(int num) : base(num)
{
//todo
}
向上转型与向下转型
向上转型:把一个派生类转换为他的基类 向下转型:把一个基类转换成他的派生类
public class Shape{}
public class Circle:Shape{}
Circle circle1 = new Circle();
//向上转型(circle转换为shape类)是隐式的,没有限制
Shape shape = circle;
//向下转型(shape转为circle2)显式的,需要表明转换的类型
Circle circle2 = (Circle)shape;
//向下转型可能失败(比如shape转换为car类),失败会报出异常
as和is关键字
as关键字转换失败会把car对象转换为空
Car car = obj as Car//不会抛出异常
if(car != null){
//todo
}
is关键字可以检查对象的类型
if(obj is Car){
Car car =(Car)obj;
}
向上转型可以用于创建一个存放某数据的列表(因为其派生类对象也属于本类)
向下转型可以用于将列表中的数据取出(全部存入基类列表中,将无法使用子类方法,故可以先向下转型,后使用)
装箱和拆箱
值类型和引用类型
值类型保存在栈(steak)中,值类型包括基本数据类型以及结构(struct),steak中数据生命周期较短,内存由编译器自动分配,程序结束自动被回收 引用类型(class,对象)保存在堆(heap)中,数据长度不固定,数据类型结构复杂,手动释放内存
装箱和拆箱
将值类型转换为引用类型的过程称为装箱
从对象中提取基本数据类型称为拆箱
装箱和拆箱涉及额外的对象创建和销毁,因此都具有明显的性能问题,应当尽量避免,可以使用泛型代替装箱和拆箱操作