目录
多态
1、概念:让一个对象能够表现出多种的状态(类型) 一个接口,多个功能
2、三种实现多态手段:虚方法、抽象类、接口
3、虚方法:在父类方法前面添加一个关键字:virtual,将该方法标记为虚方法,子类就可以重写该方法,
子类重写的时候,函数名与父类一致,方法前面添加关键字override。
4、 is :判断是否是该种类型 成功,返回true 失败:false
as:将该变量转换成该种类型 如果成功转换,就转了,如果失败,返回null
if (pers[i] is Chinese)
{
Chinese ch = pers[i] as Chinese;
}
翻译:如果pers[i]是Chinese类型,就将pers[i]转换成Chinese类型,并赋值给ch对象
静态多态性
- 函数重载
- 运算符重载
动态多态性
- 动态多态性是通过 抽象类 和 虚方法 实现的
实现多态的手段: 虚方法 抽象类 接口
一、虚方法:
将父类的方法标记为虚方法,使用关键字virtual.这个函数就可以被子类重新写一遍。子类重写该方法时,使用override关键字
每个类都有一个SayHello()方法。
在声明中包含virtual关键字是为了重写方法而存在的。
eg:
using System;
namespace PolymorphismApplication
{
class Shape
{
protected int width, height;
public Shape( int a=0, int b=0)
{
width = a;
height = b;
}
public virtual int area()
{
Console.WriteLine("父类的面积:");
return 0;
}
}
class Rectangle: Shape
{
public Rectangle( int a=0, int b=0): base(a, b)
{
}
public override int area ()
{
Console.WriteLine("Rectangle 类的面积:");
return (width * height);
}
}
class Triangle: Shape
{
public Triangle(int a = 0, int b = 0): base(a, b)
{
}
public override int area()
{
Console.WriteLine("Triangle 类的面积:");
return (width * height / 2);
}
}
class Caller
{
public void CallArea(Shape sh)
{
int a;
a = sh.area();
Console.WriteLine("面积: {0}", a);
}
}
class Tester
{
static void Main(string[] args)
{
Caller c = new Caller();
Rectangle r = new Rectangle(10, 7);
Triangle t = new Triangle(10, 5);
c.CallArea(r);
c.CallArea(t);
Console.ReadKey();
}
}
}
二、里氏转换
优点
1. 提高代码的重用性,子类拥有父类的方法和属性;
2. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性。
显示转换:父类对象转换为子类类型必须使用强制转换
Person p = new Teacher();
Teacher t = (Teacher)p;//转换成功
t.SayHi();
隐式转换:子类对象转换为父类类型可以直接转
Student stu = new Student();//转换成功
Person p = stu;
p.Show();
1、特点
1)、子类可以赋值给父类,如果有一个地方,需要一个父类作为参数,我们可以给一个子类
2)、如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象
2、子类对象可以调用父类中的成员,但是父类对象永远只能调用自己的成员。
3、关键字is/as转换:
is:表示类型转换,如果能够转换成功,则返回true 否则返回false
as:表示类型转换,如果能够转换则返回对象,否则返回null
三、抽象类
C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。
- 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
抽象---具体
抽象类关键字:abstract
抽象类的特点:
1、不能被实例化,也就是说不能创建抽象类的对象
2、