C# |方法覆盖
C# 中的方法覆盖类似于 C++中的 虚函数 。方法重写是一种允许从派生类中的另一个类(基类)调用函数的技术。在派生类中创建与基类中的方法具有相同签名的方法称为方法重写。
简单地说,Overriding 是一个允许子类或子类提供某个方法的特定实现的特性,该方法已经由它的一个超类或父类提供。当子类中的方法与其超类中的方法具有相同的名称、相同的参数或签名以及相同的返回类型(或子类型)时,那么子类中的方法被称为覆盖超类中的方法。方法重写是 C# 实现运行时多态(动态多态)的方法之一。
被重写声明重写的方法称为被重写的基方法。重写方法是从基类继承的成员的新实现。被重写的基方法必须是虚拟的、抽象的或重写的。
示例:
class base_class
{
public void gfg();
}
class derived_class : base_class
{
public void gfg();
}
class Main_Method
{
static void Main()
{
derived_class d = new derived_class();
d.gfg();
}
}
这里基类在派生类中被继承,并且在两个类中具有相同签名的方法 gfg() 被重写。
在 C# 中,我们可以使用 3 种类型的关键字进行方法覆盖:
- 虚拟关键字:此修饰符或关键字在基类方法中使用。它用于修改基类中的一个方法,因为在派生类中覆盖了那个特定的方法。
- 覆盖:此修饰符或关键字与派生类方法一起使用。用于将虚或抽象方法修改为派生类,并在基类中呈现。
class base_class
{
public virtual void gfg();
}
class derived_class : base_class
{
public override void gfg();
}
class Main_Method
{
static void Main()
{
derived d_class = new derived_class();
d.gfg();
base_class b = new derived_class();
b.gfg();
}
}
这里首先, d 引用类派生类的对象,它调用类派生类的 gfg() ,然后, b 引用基类,它持有派生类的对象,它调用派生类的 gfg() 。这里 gfg() 方法从基类获取权限来重写派生类中的方法。
示例 1: 不使用虚拟和覆盖修改器的方法覆盖
C
// C# program to demonstrate the method overriding
// without using 'virtual' and 'override' modifiers
using System;
// base class name 'baseClass'
class baseClass
{
public void show()
{
Console.WriteLine("Base class");
}
}
// derived class name 'derived'
// 'baseClass' inherit here
class derived : baseClass
{
// overriding
new public void show()
{
Console.WriteLine("Derived class");
}
}
class GFG {
// Main Method
public static void Main()
{
// 'obj' is the object of
// class 'baseClass'
baseClass obj = new baseClass();
// invokes the method 'show()'
// of class 'baseClass'
obj.show();
obj = new derived();
// it also invokes the method
// 'show()' of class 'baseClass'
obj.show();
}
}
Output:
Base class
Base class
说明:在本程序中,对象 obj 两次调用 class baseClass,调用 class baseClass 的方法 show() 。为了避免这个问题,我们使用虚拟和覆盖关键字。
示例 2: 使用虚拟和替代修改器的方法替代。
C
// C# program to illustrate the use of
//'virtual' and 'override' modifiers
using System;
class baseClass {
// show() is 'virtual' here
public virtual void show()
{
Console.WriteLine("Base class");
}
}
// class 'baseClass' inherit
// class 'derived'
class derived : baseClass
{
//'show()' is 'override' here
public override void show()
{
Console.WriteLine("Derived class");
}
}
class GFG {
// Main Method
public static void Main()
{
baseClass obj;
// 'obj' is the object
// of class 'baseClass'
obj = new baseClass();
// it invokes 'show()'
// of class 'baseClass'
obj.show();
// the same object 'obj' is now
// the object of class 'derived'
obj = new derived();
// it invokes 'show()' of class 'derived'
// 'show()' of class 'derived' is overridden
// for 'override' modifier
obj.show();
}
}
Output:
Base class
Derived class
版权属于:月萌API www.moonapi.com,转载请注明出处