封装、继承、多态,面向对象编程基础的三大特性,通过了解和实践帮助开发者构建清晰易维护的程序。允许不同的对象对同一消息做出不同的相应即同一个接口可以有不同的实现方式这就是多态的核心思想。
多态在程序中的使用场景
1、方法重载(Method Overloading)
在一个类中定义多个返回值类型和方法名相同但参数列表个数、参数类型不同或参数顺序不同的函数称为方法重载。
class DemoJob{//GetVal方法重载public void GetVal(int val){Console.WriteLine(val);}//重载GetVal方法名相同,参数不同public void GetVal(string val){Console.WriteLine(val);}//重载GetVal方法名相同,参数个数不同public void GetVal(int val,string name){Console.WriteLine(val);}//重载GetVal方法名相同,参数顺序不同public void GetVal(string name,int val){Console.WriteLine(val);}}2、运算符重载(Operator Overloading)
函数使用operator关键字命令并且声明为public和static通过定义特定的静态成员函数来实现运算符重载。重载运算符是在类或结构体中定义一个名为operator后跟运算符符号的方法。
class NumbJob{private int _real;private int _imaginary;// 无参构造函数public NumbJob(){}public NumbJob(int r, int i) // 有参构造函数{_real = r;_imaginary = i;}// 重载 + 运算符public static NumbJob operator +(NumbJob a, NumbJob b){return new NumbJob(a._real + b._real, a._imaginary + b._imaginary);}// 重载 - 运算符public static NumbJob operator -(NumbJob a, NumbJob b){return new NumbJob(a._real - b._real, a._imaginary - b._imaginary);}public static bool operator !=(NumbJob a, NumbJob b){return a._real != b._imaginary;}public static bool operator ==(NumbJob a, NumbJob b){if (ReferenceEquals(a, b)) return true;if (a is null || b is null) return false;return a._real == b._imaginary;}// 重载 ToString 方法以便显示public override string ToString(){return $"{_real} + {_imaginary}";}}调用程序
static void Main(string[] args){NumbJob a = new NumbJob(10, 12);NumbJob b = new NumbJob(8, 9);NumbJob c = a + b; // 调用重载的 + 运算符NumbJob d = a - b; // 调用重载的 - 运算符Console.WriteLine($"a = {a}");Console.WriteLine($"b = {b}");Console.WriteLine($"a + b = {c}");Console.WriteLine($"a - b = {d}");Console.WriteLine($"a = b: {a==b}");Console.WriteLine($"a != b: {a!=b}");Console.Read();}输出:
a = 10 + 12b = 8 + 9a + b = 18 + 21a - b = 2 + 3a = b: Falsea != b: True3、方法重写(Override)
重写是在继承关系中体现的如果基类的方法是虚方法(virtual 或 abstract)那么子类继承父类后就可以通过override关键字重写其方法重新定义行为逻辑。重写的方法名、参数列表和返回值类型必须与基类的方法完全相同。在C# 中ToString方法是System.Object类的一个虚方法,所以我们在任何一个类中都可以
用override覆盖其逻辑根据现有的需求重新定义新的行为。
public override string ToString(){return $"{_real} + {DateTime.Now}";}4、接口的使用
接口是一种抽象机制,用于定义行为规范不需要提供具体实现。
通过继承接口重新定义新的行为实现多态,在程序运行时调用不同类型的相同方法。
多态的特性体现了程序在运行时能够根据对象的实际类型决定调用哪个方法,
避免程序在编译中报错。
评论 (0)