大家好!今天,我们将探讨面向对象编程 (OOP) 中的一个基本概念 - 多态性。具体来说,我们将重点介绍其三种主要形式:方法重载、方法覆盖和方法隐藏。对于任何使用 OOP 语言(例如 C#)的程序员来说,理解这些概念都至关重要。
一. 多态性
多态性源自希腊语,意为“多种形式”,是 OOP 的一项功能,允许将不同类型的对象视为父类型的对象。它包括方法重载、方法覆盖和方法隐藏。
二. 方法重载
方法重载是一种允许类拥有多个具有相同名称但不同参数的方法的功能。它增加了程序的可读性,并且是实现编译时多态性的一种方法。
三. 方法重写
方法重写是一种功能,允许子类提供其父类已提供的方法的特定实现。这是实现运行时多态性的一种方法。在父类中必须使用 virtual 关键字标记该方法,在子类中则使用 override 关键字标记该方法。
四. 方法隐藏
方法隐藏是一种功能,即子类中的方法隐藏父类中的方法。它类似于方法覆盖,但用于您不希望子类继承父类的方法时。这是使用 new 关键字完成的。
五. 比较
六. C#示例
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine("Try Polymorphism in C#");
Base b = new Child(); // 创建一个基类引用指向派生类对象
b.Print(); // 调用派生类的 Print 方法
b.Print("Red"); // 调用基类的 Print(string) 方法
b.PrintAdd(1, 2); // 调用基类的 PrintAdd(int, int) 方法
b.PrintAdd(1f, 4f); // 调用基类的 PrintAdd(float, float) 方法
}
public class Base
{
public void PrintAdd(int a, int b)
{
Console.WriteLine("Base:Add {0}", a + b);
}
public void PrintAdd(float a, float b)
{
Console.WriteLine("Base:Add {0}", a + b);
}
public virtual void Print(string color)
{
Console.WriteLine("Base:Print {0}", color);
}
public virtual void Print()
{
Console.WriteLine("Base:Print");
}
}
public class Child : Base
{
public new void Print(string color)
{
Console.WriteLine("Child:Print {0}", color);
}
public override void Print()
{
Console.WriteLine("Child:Print");
}
}
}
//输出结果
/*
Try Polymorphism in C#
Child:Print
Base:Print Red
Base:Add 3
Base:Add 5
*/
解释
在您的 Base 类中,您已重载 PrintAdd 方法。该方法的一个版本接受两个整数,另一个版本接受两个浮点数。这是方法重载的一个例子,其中相同的方法名称与不同的参数一起使用。
在 Child 类中,您已重写了无参数的 Print 方法。这是方法重写的示例,其中子类为其父类已提供的方法提供了不同的实现。
此外,在您的 Child 类中,您隐藏了接受字符串参数的 Print 方法。这是方法隐藏的一个例子,其中子类中的方法隐藏了父类中的方法。
当您创建一个 Child 对象但将其声明为 Base 对象 (Base b = new Child()😉,并调用 Print 方法时,它将调用 Child 类的 Print 方法(由于方法覆盖),并且不带参数(由于方法隐藏)和 Base 类的 Print 方法(带有字符串参数)。PrintAdd 方法将始终调用 Base 类的方法,因为这些方法在 Child 类中不会被覆盖或隐藏。
七. 结论
方法重载、覆盖和隐藏是 C# 和面向对象编程中的关键概念。它们增强了代码的可读性、可重用性和灵活性。但是,应谨慎使用它们以避免复杂性和可维护性问题。理解这些概念对于在 C# 中有效编程至关重要。