C#每日一课(十八)
C# 多态性
多态性,意味着有多重形式。在面向对象编程中,多态一般的表现形式是“一个接口,多个功能实现”。
多态性分为静态的或动态的,静态多态表示函数的响应是在编译时发生的。动态多态则函数的响应是运行时发生的。
静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C#中提供了两种方式实现
1.函数重载
2.运算符重载
函数重载
在同一个范围内对相同的函数名有多个定义。注意函数的定义必须要彼此不同,可以是参数类型不同,也可以参数不同(特别注意:只有返回类型不同的函数声明不可以重载)。
使用Visual Studio新建项目chapter13_001
在类中新增重载函数:
//重载函数Print
void Print(int i)
{
Console.WriteLine("int:{0}", i);
}
void Print(double d)
{
Console.WriteLine("double:{0}", d);
}
void Print(string s)
{
Console.WriteLine(s);
}
在Main方法做中做如下调用
Printdata pd = new Printdata();
//调用Print函数
pd.Print("--------重载函数Print调用-------");
pd.Print("输出int值");
pd.Print(10);
pd.Print("输出double值");
pd.Print(0.1);
pd.Print("输出string值");
pd.Print("C#");
Console.ReadKey();
编译运行后结果如下:
动态多态性
C#中可以使用abstract创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自这个抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可以被派生类实现,在派生类中可以根据具体派生出来的类形成列合适更专业的实现。
关于抽象类的一些规则
- 不可以创建一个抽象类的实例
- 不可以在一个抽象类的外部声明一个抽象方法
- 通过在类定义前面加上关键字sealed把类声明为密封类,当一个类被声明为sealed后则不可以被继承,抽象类因为存在抽象方法又不可以实例化一定要派生子类的所以抽象类是不可以声明为sealed的。
新增一个抽象类:Person
abstract class Person
{
public abstract void Todo();
}
这里Todo是一个抽象方法
新增一个派生类Student,它继承抽象类Person,并在类中重载抽象方法Todo
class Student : Person
{
public override void Todo()
{
Console.WriteLine("学生学习!");
}
}
新增一个派生类Teacher,它继承抽象类Person,并在类中重载抽象方法Todo
class Teacher : Person
{
public override void Todo()
{
Console.WriteLine("教师教书!");
}
}
在Main方法中新增如下代码:
pd.Print("-------------重载抽象方法--------------");
Student stu = new Student();
stu.Todo();
Teacher t = new Teacher();
t.Todo();
编译运行后结果如下:
当有一个定义在类中的函数需要在继承中实现时,可以使用虚方法,虚方法使用关键字virtual,虚方法可以在不同的继承类中有不同的实现。对虚拟方法中的调用在运行时进行的。
可以把上面的Perosn类不定义为abstract类,可以把要在继承类中实现的代码写为虚方法:
Person类改造后如下:
class Person
{
public virtual void Todo()
{
Console.WriteLine("父类中的Todo方法");
}
}
另个两个派生类不改变的情况下会得到和使用抽象类一样的结果。
动态多态性是在运行时来确定最终的实现方式是什么,可以通过抽象类和虚方法来实现。