C# 函数覆盖总结学习(推荐)
1. 前言
函数覆盖(Function Overriding)是 C# 中非常常见的概念,它是指在类的派生类(子类)中重新定义基类(父类)中已有的函数,以达到重载函数的效果。本文将介绍 C# 函数覆盖的相关知识和学习笔记,并附上多个示例代码。
2. 函数覆盖的定义
在 C# 中,函数覆盖的定义如下:
class A
{
public virtual void Function()
{
Console.WriteLine("A.Function");
}
}
class B : A
{
public override void Function()
{
Console.WriteLine("B.Function");
}
}
上述代码中,定义了两个类 A 和 B,其中类 A 中定义了一个名为 Function
的虚函数,而类 B 中覆盖了类 A 中的 Function
函数,这样的操作叫做函数覆盖。
需要注意的是,在覆盖基类的虚函数时,子类中的函数必须与父类中的函数具有完全相同的返回类型、参数列表和名称。
3. 函数覆盖的作用
函数覆盖的作用可以分为两个方面:
3.1 多态性
函数覆盖实现了多态性,即一个对象可以以多种形态呈现。在上面的示例中,当实例化一个 B 类对象并调用 Function
函数时,将会调用 B 类覆盖后的函数:
B b = new B();
b.Function(); // 执行结果为 "B.Function"
3.2 可维护性
函数覆盖还实现了可维护性,即可以在不影响基类的前提下修改子类的函数行为。上面的示例中,如果我们需要修改 B 类的 Function
函数的实现,只需要覆盖(重写)基类的 Function
函数即可。
4. 虚函数和抽象类
在上述示例代码中,我们使用了虚函数实现了函数覆盖。在 C# 中,虚函数的定义如下:
class A
{
public virtual void Function()
{
// 函数实现
}
}
在 A 类中定义的 Function
函数是一个虚函数,通过 virtual
关键字来声明。虚函数可以被子类继承和覆盖。
除了虚函数,C# 还有一种特殊的类,叫做抽象类。抽象类是一种不能被实例化的类,它只能被继承。
抽象类中可以定义抽象方法。抽象方法只有声明,没有实现,这意味着抽象类不能直接实例化,必须通过继承后,由派生类去实现抽象方法。
示例代码如下:
abstract class A
{
public abstract void Function();
}
class B : A
{
public override void Function()
{
// 函数实现
}
}
在上述代码中,A 类是一个抽象类,其 Function
函数是一个抽象方法,没有实现。因此,只有通过继承 A 类并实现 Function
函数的派生类才可以被实例化。
5. 示例说明
5.1 示例一
下面是一个基类 Animal 和它的两个派生类 Cat 和 Dog 的示例代码:
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal makes sound.");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Cat meows.");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks.");
}
}
在上述代码中,基类 Animal 中定义了虚函数 MakeSound
,用于表示动物发出声音的一般性质。Cat 和 Dog 类都继承了 Animal 类并覆盖了 MakeSound
函数,以实现各自的声音特性。
5.2 示例二
下面是一个基类 Employee 和它的两个派生类 Manager 和 Developer 的示例代码:
class Employee
{
public virtual double CalculateSalary(double salaryPerHour, double hoursWorked)
{
return salaryPerHour * hoursWorked;
}
}
class Manager : Employee
{
public override double CalculateSalary(double salaryPerHour, double hoursWorked)
{
return salaryPerHour * hoursWorked * 1.5;
}
}
class Developer : Employee
{
public override double CalculateSalary(double salaryPerHour, double hoursWorked)
{
return salaryPerHour * hoursWorked * 2;
}
}
在上述代码中,基类 Employee 中定义了虚函数 CalculateSalary
,用于计算雇员的工资。Manager 和 Developer 类都继承了 Employee 类并覆盖了 CalculateSalary
函数,以实现各自的计算工资方式。
结论
C# 函数覆盖是实现多态性和可维护性的非常重要的概念和技术。在实际开发过程中,我们应该根据具体需求和场景,合理使用函数覆盖和其他面向对象编程的特性,以实现高效、可维护、易扩展的代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 函数覆盖总结学习(推荐) - Python技术站