多态性意味着有多重形式,在面向对象编程中,多态性往往表现为“一个接口,多个功能”。多态性可以分为静态和动态两种。在静态多态中,函数的响应实在编译时发生的,在动态多态性中,函数的响应是在运行时发生的。
1. 静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供两种技术来实现静态多态性。
1.1 函数重载
在同一范围内对相同函数有多个定义,参数或返回类型不同的函数声明叫作函数重载。
1.2 运算符重载
重载运算符是具有特殊名称的函数,通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。
语法:
访问修饰符 static 返回类型 operator运算符(参数列表){
操作代码;
}
是否可重载运算符一览:
运算符 | 是否可重载 |
---|---|
+,-,!,~,++,-- | 一元运算符,可被重载 |
+,-,*,/,% | 二元运算符,可被重载 |
==,!=,>,<,>=,<= | 可被重载 |
&&,|| | 逻辑运算符不能被直接重载 |
+=,-=,*=,/=,%= | 赋值运算符不能被重载 |
=,.,?:,->,new,is,sizeof,typeof | 不能被重载 |
例如:
class Triangle{
private double length;
private double height;
public Triangle(){}
public Triangle(double length,double height){
this.length=length;
this.height=height;
}
public void Show(){
Console.WriteLine("area:{0}",(length*height)/2);
}
public static Triangle operator+(Triangle trA,Triangle trB){
Triangle trC=new Triangle();
trC.length=trA.length+trB.length;
trC.heigth=trA.height+trB.height;
return trC;
}
}
class Program{
static void Main(string[] args){
Triangle trA=new Triangle(3,4);
Triangle trB=new Triangle(6,8);
Triangle trC=trA+trB;
trC.Show();
Console.ReadKey();
}
}
2. 多态多态性
- 接口、抽象类
当一个类继承抽象类或者实现接口的时候 就完成了动态多态性。 - 重写
在 C# 中,重写需要使用关键字 virtual 以及 override。语法为:
//被重写的父类方法
访问修饰符 virtual 返回类型 方法名(){}
//子类重写
访问修饰符 override 返回类型 方法名(){}
- 隐藏基类的方法
父类与子类有共同的方法,但子类不实用 override 重写而使用 new 来修饰。语法:
//父类被隐藏的方法 virtual可无
访问修饰符 virtual 返回类型 方法名(){}
//子类隐藏父类方法
new 访问修饰符 返回类型 方法名(){}
重写和隐藏的区别:
在进行对象下转型时,重写无法访问父类被重写的方法,而隐藏可以访问。例如:
FatherClass fc;
SonClass sc=new SonClass();
fc=sc;
fc.方法;
//若是重写则执行子类的方法
//若是隐藏则执行父类的方法
网友评论