多态性

2019-04-04  本文已影响0人  东经20度

多态性意味着有多重形式,在面向对象编程中,多态性往往表现为“一个接口,多个功能”。多态性可以分为静态和动态两种。在静态多态中,函数的响应实在编译时发生的,在动态多态性中,函数的响应是在运行时发生的。

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. 多态多态性

  1. 接口、抽象类
    当一个类继承抽象类或者实现接口的时候 就完成了动态多态性。
  2. 重写
    在 C# 中,重写需要使用关键字 virtual 以及 override。语法为:
//被重写的父类方法
访问修饰符 virtual 返回类型 方法名(){}
//子类重写
访问修饰符 override 返回类型 方法名(){}
  1. 隐藏基类的方法
    父类与子类有共同的方法,但子类不实用 override 重写而使用 new 来修饰。语法:
//父类被隐藏的方法 virtual可无
访问修饰符 virtual 返回类型 方法名(){}
//子类隐藏父类方法
new 访问修饰符 返回类型 方法名(){}

重写和隐藏的区别:
在进行对象下转型时,重写无法访问父类被重写的方法,而隐藏可以访问。例如:

FatherClass fc;
SonClass sc=new SonClass();
fc=sc;
fc.方法;
//若是重写则执行子类的方法
//若是隐藏则执行父类的方法
上一篇 下一篇

猜你喜欢

热点阅读