Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法签名、重载、重写:所有这些术语都相关吗?_C#_.net_Overloading_Overriding_Method Signature - Fatal编程技术网

C# 方法签名、重载、重写:所有这些术语都相关吗?

C# 方法签名、重载、重写:所有这些术语都相关吗?,c#,.net,overloading,overriding,method-signature,C#,.net,Overloading,Overriding,Method Signature,“重载”和“重写”这两个术语听起来非常相似(这就是为什么它们有时相互对立的原因),但这两个概念在技术上是否相关 术语“重载”和“重写”是否相关 术语“重载”取决于“方法签名”的定义。所以我有一个类似的问题 (相关一)术语“”是否也与“凌驾”相关 重载是指具有多个同名但参数不同的函数。比如说 void SayHi(string name) { ... } void SayHi(string, int age) {.... } 比如说 void SayHi(string name) { ... }

“重载”和“重写”这两个术语听起来非常相似(这就是为什么它们有时相互对立的原因),但这两个概念在技术上是否相关

  • 术语“重载”和“重写”是否相关
  • 术语“重载”取决于“方法签名”的定义。所以我有一个类似的问题

  • (相关一)术语“”是否也与“凌驾”相关
    重载是指具有多个同名但参数不同的函数。比如说

    void SayHi(string name) { ... }
    void SayHi(string, int age) {.... }
    
    比如说

    void SayHi(string name) { ... }
    void SayHi(string, int age) {.... }
    
    这些是重载

    重写“替换”了一个现有函数,因此您接受了一个现有函数,并提供了一个具有相同名称和相同参数的全新函数

    class Person
    {
        public virtual void SayHi(string name)
        {
            // ....
        }
    }
    
    class Teenager : Person
    {
        public override void SayHi(string name)
        {
            // ....
        }
    }
    
    方法签名与重写相关,因为新的重写函数必须具有与其尝试重写的方法相同的方法签名,并且返回类型也必须相同


    方法签名与重载有关,重载必须有不同的方法签名。

    重载是指具有相同方法或函数名的多个版本,其中每个类型都有不同的参数类型,如:C++中的代码> INIT(int,int)< /> >和<代码> init(const char)。使用特定于参数类型的实现。编译器将根据您在特定调用中使用的参数选择要调用的版本。方法签名指的是参数的类型和顺序。对于重载,不同版本的方法的方法签名必须不同


    重写是指一个派生类实现它自己在基类中声明的方法版本,将该方法的基类实现替换为该派生类特有的基类实现。对于重写,派生类方法的方法签名必须与基类方法的方法签名相同。如果不同,则派生类重载基类方法,而不是重写它。

    确切地说:重写与“方法签名”和“返回类型”相关,但重载仅与“方法签名”相关。因此,这些概念之间有两个区别。重写和重载的第一个区别是它们的用途。第二个是检查返回类型是否覆盖,但忽略重载(以避免同一类型中的public int GiveMeSomething()和public string GiveMeSomething()等方法的歧义)。我希望在MSDN“方法签名”页面上找到第二个区别,因为所有这些概念(“方法签名”,“重写”和“重载”)是相关的。警告:通常,为了方法签名的目的,会忽略返回类型。如果在静态类型语言中重写方法,则需要保持返回类型相同,或者注意新的返回类型和任何
    virtual
    声明,以确保运行时返回的内容与编译器预期的内容匹配。这当然不是动态类型语言的问题。