多态是C#中的重要概念之一。多态性有两种类型,编译时和运行时。重载和覆盖概念分别用于实现此目的。在重写中,子类可以以不同的方式实现父类方法,但子类方法与父类具有相同的名称和相同的方法签名,而在重载中,一个类中有多个具有相同名称和不同参数的方法。
C# 中覆盖和重载的工作原理通过示例进行解释:
我们在重写时使用一些关键字,例如 virtual、override 和 base。
语法:
class Parent { public virtual void Example() // base class { Console.WriteLine("parent class"); } } class Child: Parent { public override void Example() // derived class { base.Example(); Console.WriteLine("Child class"); } }
这里使用了virtual和override关键字,这意味着基类是virtual的,子类可以实现这个类,override意味着这个子类与父类具有相同的名称和相同的方法签名。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverridingExample { class Subject // base class { public virtual void study() // base class method { Console.WriteLine("Study all the subjects"); } } class Mathematics: Subject // derived class { public override void study() // derived class method { Console.WriteLine("Study Mathematics"); } } class Program { // main method static void Main(string[] args) { Subject s = new Mathematics(); s.study(); Console.ReadLine(); } } }
在上面的示例中,方法名称相同,但实现不同。基类具有虚函数,因此子类可以以自己的方式实现父类方法。子类方法有关键字 override ,表明该方法是重写方法。
输出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverridingExample { class Subject // base class { public virtual void study() // base class method { Console.WriteLine("Study all the subjects"); } } class Mathematics: Subject // derived class { public override void study() // derived class method { base.study(); Console.WriteLine("Study Mathematics"); } } class Program { // main method static void Main(string[] args) { Mathematics m = new Mathematics(); m.study(); Console.ReadLine(); } } }
输出:
在此示例中,派生类有一个基关键字,用于调用基类方法。因此,在这种情况下,派生方法会在基类方法之后调用。
要记住的要点:
在重载中,存在多个具有不同方法签名的方法。下面是一些示例,展示了如何通过改变参数数量、参数顺序和参数数据类型来实现重载。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public int Sum(int x, int y) { int value = x + y; return value; } public int Sum(int x, int y, int z) { int value = x + y + z; return value; } public static void Main(string[] args) // main method { Demo d = new Demo(); int sum1 = d.Sum(24, 28); Console.WriteLine("sum of the two " + "integer value : " + sum1); int sum2 = d.Sum(10, 20, 30); Console.WriteLine("sum of the three " + "integer value : " + sum2); Console.ReadLine(); } } }
在上面的示例中,有两个名称相同但参数数量不同的方法。 第一个方法包含两个参数,而第二个方法包含三个参数。这称为方法重载。
输出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public int Sum(int x, int y, int z) { int value = x + y + z; return value; } public double Sum(double x, double y, double z) { double value = x + y + z; return value; } public static void Main(string[] args) // main method { Demo d = new Demo(); int sum1 = d.Sum(24, 28,7); Console.WriteLine("sum of the two " + "integer value : " + sum1); double sum2 = d.Sum(10.0, 20.0, 30.0); Console.WriteLine("sum of the three " + "integer value : " + sum2); Console.ReadLine(); } } }
在上面的例子中,有两个方法名称相同,但数据类型不同。第一个方法具有整数数据类型,而第二个方法具有双精度数据类型。因此,在这种情况下,参数会因数据类型的不同而变化。
输出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public void Details(String name,int id) { Console.WriteLine("Name " + name + ", " + "Id " + id); ; } public void Details(int id,string name) { Console.WriteLine("Name " + name + ", " + "Id " + id); } public static void Main(string[] args) // main method { Demo d = new Demo(); d.Details("John", 10); d.Details("Joe", 20); Console.ReadLine(); } } }
在上面的例子中,方法名称相同,但参数顺序不同。第一个方法有名称和 ID。而第二个分别有 id 和 name。
输出:
要记住的要点:
以下是优点说明。
重载和重写在实现多态性方面发挥着重要作用。重写允许派生类以自己的方式实现,而重载则涉及具有相同名称的方法和各种类型的参数实现。
以上是C# 中的重载和重写的详细内容。更多信息请关注PHP中文网其他相关文章!