什么是多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在运行时,可以通过调用同一个方法,来实现派生类中不同表现。
c#中多态的实现形式
方法重载
虚方法
抽象方法
接口
虚方法
什么是虚方法
如果实例方法声明中有virtual修饰符,可以将实例方法称为“虚方法”。
如果没有virtual修饰符,可以将实例方法称为“非虚方法”。
可以在派生类中重写父类虚方法,在派生类我们可以用override修饰符。
重写返回类型相同、签名相同的且同名虚方法。
虚方法不能私有。
virtual
在基类中我们可以通过virtual关键字声明一个虚方法。
override
在派生类中我们可以通过override关键字重写签名相同的虚方法。
sealed
在派生类中我们可以通过sealed封闭一个虚方法的重写
抽象方法
抽象方法是没有实现代码的虚方法;
也叫纯需方法;
抽象方法使用abstract修饰符进行声明,只能在同一声明了abstract的类中使用;
继承了抽象类的子类必须实现抽象类的所有抽象方法。
抽象类
用abstract修饰过的类是抽象类
抽象类无法被实例化
子类如果继承自抽象类,那么子类必须实现abstract类中所有的abstract成员。
定义抽象类
访问修饰符 abstract class 类名
{
访问修饰符 abstract 函数名;
}
虚方法及抽象类的选择
如果父类中的方法有默认的实现,并且父类需要被实例化,
这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,
则可以将该类定义为抽象类。
接口
访问修饰符 interface 接口名
{
属性;
方法
}
1.接口定义了可由类和结构实现的协定;
2.接口可以包含方法、属性、事件和索引器。不包含字段;
3.接口不提供所定义的成员的实现代码,仅指定必须由实现接口的类或结构提供的成员;
4.接口是多重继承的,一个接口可以继承另一个接口或者多个接口,一个类可以继承一个或者多个接口;
5.接口的声明与类基本一致;
6.接口 的方法和属性均不允许实现;
7.接口不能有构造,不能有字段,不能重载运算符;
8.接口中成员必须为public。
接口的优势
多继承,可以让类更灵活,并在减少代码重复的情况下降低代码关联性(耦合);
多套:程序可扩展性,节约成本,提高效率;
两个不同类型的物体,具有相同行为,考虑使用接口。
接口的使用
访问修饰符 类名:基类,接口名1,接口名2
{
属性;
方法
}
1.继承关系中如果有类,必须是第一个;
2.继承了接口的类必须实现该接口的所有成员;
3.接口可以继承接口,但不能继承类。
如果我们继承了多个接口有相同名字的成员,我们可以使用显示实现接口来区别不同的成员
接口名.成员{ }
显示实现的目的是区别2个接口 同名方法;
显示实现界面不能加载访问修饰符,默认private;
显示实现的接口不能直接通过类对象来调用。