Only用法:C#-关键字使用虚拟+ 覆盖与新(versus用法)

在基本类型“virtual”中声明一个方法,然后在使用“override”关键字的子类型中覆盖它,而不是简单地使用“new”关键字在子类型中声明匹配方法时,有什么区别?

247

我总是发现这样的事情更容易理解图片:

再一次用 Joseph Daigle 的密码,

public cl Foo
{
     public /*virtual*/ bool DoSomething() { return false; }
}
public cl Bar : Foo
{
     public /*override or new*/ bool DoSomething() { return true; }
}

如果你然后调用这样的代码:

Foo a = new Bar();
a.DoSomething();

注意:重要的是我们的对象实际上是一个Bar,但是我们是将其存储在类型为Foo的变量中(这类似于铸造它)

然后,结果将如下所示,具体取决于您在声明类时使用的是virtual/override还是new

Virtual/Override explanation image

196

“new”关键字不覆盖,它表示与基类方法无关的新方法。

public cl Foo
{
     public bool DoSomething() { return false; }
}
public cl Bar : Foo
{
     public new bool DoSomething() { return true; }
}
public cl Test
{
    public static void Main ()
    {
        Foo test = new Bar ();
        Console.WriteLine (test.DoSomething ());
    }
}

这将打印 false,如果您使用 override,它将打印 true。

(基本代码取自 Joseph Daigle)

所以,如果你正在做真正的多态性,你应该总是 OVERRIDE。唯一需要使用“new”的地方是当方法与基类版本没有任何关系时。

46

这里有一些代码来了解虚拟和非虚拟方法的行为差异:

cl A
{
    public void foo()
    {
        Console.WriteLine("A::foo()");
    }
    public virtual void bar()
    {
        Console.WriteLine("A::bar()");
    }
}
cl B : A
{
    public new void foo()
    {
        Console.WriteLine("B::foo()");
    }
    public override void bar()
    {
        Console.WriteLine("B::bar()");
    }
}
cl Program
{
    static int Main(string[] args)
    {
        B b = new B();
        A a = b;
        a.foo(); // Prints A::foo
        b.foo(); // Prints B::foo
        a.bar(); // Prints B::bar
        b.bar(); // Prints B::bar
        return 0;
    }
}
21

new关键字实际上创建了一个仅存在于该特定类型上的全新成员。

For instance

public cl Foo
{
     public bool DoSomething() { return false; }
}
public cl Bar : Foo
{
     public new bool DoSomething() { return true; }
}

该方法存在于这两种类型上。当您使用反射并获取类型Bar的成员时,您实际上会发现 2 个名为DoSomething()的方法看起来完全相同。通过使用new,您可以有效地隐藏基类中的实现,以便当类派生自Bar(在我的示例中)时,对4

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(357)
Cc协议:如何将adobeanimateCCfla导出到 illustratorCC
上一篇
Pycharm导入文件:Pycharm-导入Matplotlib
下一篇

相关推荐

  • concord是什么牌子:穿越时空,体验Concord的非凡之美

    Concord是一个美国安全品牌,专门为家庭和企业提供安全产品。它的产品包括家用安全系统、安全监控设备、智能锁、安全门等。代码:CONCORD…

    2023-03-13 11:05:04
    0 89 61
  • cords是什么意思:如何使用Cords来提高生产力

    示例示例Cords是一种常用的设计模式,它允许你把多个函数链接在一起,以便更好地处理复杂的逻辑。代码示例:…

    2023-01-28 07:40:52
    0 22 53
  • java foreach跳出本次循环:使用break语句跳出Java Foreach循环

    Java foreach跳出本次循环可以使用continue语句。continue语句会跳过当前循环中剩余的语句,然后继续下一次循环。…

    2023-01-11 12:12:41
    0 58 54
  • what can i do for you 回答:How Can I Help You?

    这取决于您想要我做什么。我可以帮助您完成一些编程任务,如创建网站,编写脚本,编写应用程序,编写API,编写数据库,编写算法,编写机器学习模型等。我也可以帮助您解决其他技术问题,如调试代码,优化性能,解决安全问题等。例如,我可以为您编写以下代码,以实现某些功能:…

    2023-01-26 13:54:16
    0 92 66
  • mifare classic tool怎么用:使用Mifare Classic Tool来管理你的Mifare Classic卡

    Mifare Classic Tool是一款开源的Android应用程序,它可用于读取和写入Mifare Classic NFC标签。它的主要功能是:…

    2023-02-17 15:24:20
    0 69 81
  • cordic算法详解:实现CORDIC算法的数学原理及其应用

    CORDIC(COordinate Rotation DIgital Computer)算法是一种基于反复旋转的数字算法,可以用来计算几何函数(如正弦、余弦、正切等)和其他复杂函数,因此也被称为旋转算法。它是一种非常有效的算法,可以在很少的时间内实现几何函数的计算。CORDIC算法的基本思想是:通过反复旋转向量,以达到计算几何函数的目的。它的具体步骤如下:…

    2023-01-14 16:01:55
    0 64 29
  • struct和class区别 A Comparison of Their Characteristics and Uses

    示例示例struct和class的主要区别在于:struct是值类型,class是引用类型。…

    2023-01-27 15:29:38
    0 60 46
  • curl 超时时间设置解决网络请求延迟的最佳实践

    示例示例cURL 超时时间设置是指在 cURL 发出请求后,等待服务器响应的最长时间。如果超过了设定的超时时间,则会收到一个超时错误。可以使用 curl_setopt() 函数来设置 cURL 超时时间,该函数的第一个参数是 cURL 资源句柄,第二个参数是 CURLOPT_TIMEOUT,用于设置 cURL 超时时间。…

    2023-02-22 07:17:34
    0 53 15

发表评论

登录 后才能评论

评论列表(48条)