C#面向对象:继承和组合

294 阅读3分钟

继承

什么是继承?

继承描述的是两个类之间的关系,通过继承可以允许一个类获得另一个类的所有代码,简单理解为:是一个什么

继承的好处

省去大多数重复的代码,提高代码复用性

多态,继承的对象的某个行为而具有多个不同表现形式的能力

语法结构

基类:包含公共的属性或者行为 派生类:继承关系使用冒号来表示,冒号后面为基类

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)中,数据长度不固定,数据类型结构复杂,手动释放内存

装箱和拆箱

将值类型转换为引用类型的过程称为装箱

从对象中提取基本数据类型称为拆箱

装箱和拆箱涉及额外的对象创建和销毁,因此都具有明显的性能问题,应当尽量避免,可以使用泛型代替装箱和拆箱操作