C# 中的重载和重写

WBOY
发布: 2024-09-03 15:13:14
原创
817 人浏览过

多态是C#中的重要概念之一。多态性有两种类型,编译时和运行时。重载和覆盖概念分别用于实现此目的。在重写中,子类可以以不同的方式实现父类方法,但子类方法与父类具有相同的名称和相同的方法签名,而在重载中,一个类中有多个具有相同名称和不同参数的方法。

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意味着这个子类与父类具有相同的名称和相同的方法签名。

示例#1
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 ,表明该方法是重写方法。

输出:

C# 中的重载和重写

示例#2
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();
}
}
}
登录后复制

输出:

C# 中的重载和重写

在此示例中,派生类有一个基关键字,用于调用基类方法。因此,在这种情况下,派生方法会在基类方法之后调用。

要记住的要点:

  • 在重写概念中,方法的名称以及方法签名和访问修饰符始终与父类和子类相同。
  • 父类方法不能是静态的。

超载

在重载中,存在多个具有不同方法签名的方法。下面是一些示例,展示了如何通过改变参数数量、参数顺序和参数数据类型来实现重载。

示例#1
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();
}
}
}
登录后复制

在上面的示例中,有两个名称相同但参数数量不同的方法。  第一个方法包含两个参数,而第二个方法包含三个参数。这称为方法重载。

输出:

C# 中的重载和重写

示例#2
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();
}
}
}
登录后复制

在上面的例子中,有两个方法名称相同,但数据类型不同。第一个方法具有整数数据类型,而第二个方法具有双精度数据类型。因此,在这种情况下,参数会因数据类型的不同而变化。

输出:

C# 中的重载和重写

示例 #3
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# 中的重载和重写

要记住的要点:

  • 在重载概念中,在顺序、类型和数量的情况下,不可能定义多个具有相同参数的方法。
  • 无法根据不同的返回类型重载方法。

C# 中重载和重写的优点

以下是优点说明。

  • 重载是实现静态的方式之一,重写是C#实现动态多态的方式之一。
  • 它为用户提供了灵活性以及代码的简洁性。

结论

重载和重写在实现多态性方面发挥着重要作用。重写允许派生类以自己的方式实现,而重载则涉及具有相同名称的方法和各种类型的参数实现。

以上是C# 中的重载和重写的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!