【问题标题】:Overloading,Overriding and Hiding? [closed]重载、覆盖和隐藏? [关闭]
【发布时间】:2010-10-25 18:44:58
【问题描述】:

谁能解释什么是.Net 中的重载、覆盖和隐藏?

谢谢

【问题讨论】:

标签: .net oop


【解决方案1】:

重载是对单个方法或运算符的多个可能“签名”的定义。每个签名采用不同的参数,本质上是一个不同的函数,与多个函数具有不同名称的情况没有什么不同。这通常用于对概念上相似的操作进行分组,例如重载 + 以与 BigIntegerString 一起使用:这两个操作似乎都适合使用 + for(除非您认为 + 的所有重载都应该定义 @ 987654321@ -- String 重载不会)。

覆盖是对同一方法签名的多个可能的实现的定义,这样实现由第零个参数的运行时类型决定(通常由在 C# 中命名 this)。

隐藏是派生类型中方法的定义,其签名与其基类型之一中的签名相同,没有覆盖。

覆盖和隐藏的实际区别如下:

  • 如果方法被覆盖,则调用的实现基于参数this运行时类型
  • 如果方法只是隐藏,则调用的实现基于参数this编译时 类型。

【讨论】:

    【解决方案2】:

    重载就是提供多个同名不同签名的方法:

    void Foo() {...}
    void Foo(int i) {...}
    

    在继承中使用覆盖来更改每个子类的实现:

    class SomeBase {
        public virtual void Foo() {}
    }
    class SomeOther : SomeBase {
        public override void Foo() {
            // different implementation, possibly calling base.Foo();
        }
    }
    

    有了上述,即使我这样做了:

    SomeBase obj = new SomeOther();
    obj.Foo();
    

    它将调用SomeOther.Foo 实现。调用的方法取决于实例类型,而不是变量。

    方法隐藏则相反;它替换方法签名,但仅适用于从派生类型调用方法:

    class SomeBase {
        public void Foo() {}
    }
    class SomeOther : SomeBase {
        public new void Foo() {
            // different implementation, possibly calling base.Foo();
        }
    }
    

    现在:

    SomeOther obj = new SomeOther();
    SomeBase baseObj = obj;
    obj.Foo(); // calls SomeOther.Foo
    baseObj.Foo(); // calls SomeBase.Foo
    

    即方法调用取决于变量,而不是实例。

    【讨论】:

    • 你的意思是?方法覆盖:虚拟(在 BASE 中)+ 覆盖(在 DERIVED 中),方法隐藏:{nothing}(在 BASE 中)+ new(在 DERIVED 中)
    【解决方案3】:

    重载是指创建多个方法,使用不同的参数。例如:

    公共级汽车 { 公共汽车() { // 做东西 } 公共汽车(int numberOfCylinders) { // 做东西 } }

    您可以看到构造函数具有相同的名称,但参数不同。您将在 Intellisense 的 Visual Studio 中看到重载的方法和构造函数,并带有上下上下的小箭头,因此您可以浏览签名。

    覆盖是指为基类中的方法提供新实现。示例:

    公共课广场 { 公共双x; // 构造函数: 公共广场(双x) { 这个.x = x; } 公共虚拟双区域() { 返回 x*x; } } 立方体类:正方形 { // 构造函数: 公共立方体(双 x):基数(x) { } // 调用区域基方法: 公共覆盖双区域() { 返回 (6*(base.Area())); } }

    请注意,在 C# 中,您不能 override 非虚拟或静态方法。

    【讨论】:

    • 请注意,在 C# 中,您不能覆盖非虚拟或静态方法。您的意思是静态方法不被继承?
    【解决方案4】:

    假设您理解其他发帖人给出的解释,记住重载和覆盖之间区别的一种方法是,当使用 overloading 时,可能存在“loads' 的同名函数。

    很傻,我知道,但它对我有用。

    【讨论】:

      【解决方案5】:

      简单来说:

      重载是指方法名称相同但签名不同。这可以在同一个班级。例如:

      int Add (int a, int b)
      {
        return a + b; // returns int
      }
      float Add (float a, float b)
      {
      return a + b; // returns float
      }
      

      重写是指派生类中的方法名称和签名与基类中的方法名称和签名相同。在这种情况下,我们说派生类覆盖了基类方法。运行哪个方法取决于哪个实例调用该方法

      例如

      public class Shape
          {
              public virtual void Draw() { }
      
          }
      
          public class Square : Shape
          {
              public override void Draw()
              {
                  // Code to draw square
              }
          }
      
          public class Circle : Shape
          {
              public override void Draw()
              {
                  // Code to draw circle
              }
          }
      

      隐藏或封装是当您将一个类的成员变量和方法声明为私有时,以便任何其他类(甚至派生类)都无法访问它们

      例如

      private int onlyICanAccess;
      
      private void OnlyICanExecute()
      {
        // ...
      }
      

      【讨论】:

      • 这不是隐藏在这个上下文中。
      • @perfectist 不过还是藏起来了
      【解决方案6】:

      重载是多态的一个例子,你可以重载已经在两个方法之间传递的参数的数字、数据类型和序列..

      overriding(与virtual不同)表示有一些定义的功能,但是你可以在inheritind的时候给出更清晰的概念

      隐藏意味着隐藏内部特征并表示本质特征,OOP概念的特征之一

      GOOGLe 获取详细信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2011-04-19
        • 2013-01-16
        • 2015-11-28
        相关资源
        最近更新 更多