【问题标题】:What if I suppress "override"?如果我抑制“覆盖”怎么办?
【发布时间】:2011-01-20 14:10:08
【问题描述】:

我注意到如果我禁止使用 override/new (Overloads/Shadows) 关键字,编译器会生成警告。通常,我设置必要的关键字。

但是如果我忘记了怎么办?

// >>>> Case A - not virtual property -
class MyPoint : Point
{
    int X { get; set; } // vs new int X { get; set; }
}

// >>>> Case B - virtual property -
class Foo 
{ 
    virtual int Value { get { return 0; } }
}

class Bar : Foo
{ 
    // vs override/new int Value { get { return 1; } } 
    int Value { get { return 1; } }
}

【问题讨论】:

    标签: .net oop virtual keyword


    【解决方案1】:

    那么您并没有覆盖该属性,而是创建了一个新属性,就像您使用了 new 关键字一样。

    Bar x = new Bar();
    Foo y = x;
    Console.WriteLine(x.Value); // Uses Bar.Value
    Console.WriteLine(y.Value); // Uses Foo.Value
    

    当用方法演示时,这通常会更清楚——在这种情况下,即使你重写,你仍然会在两个类中得到一个单独的支持字段,只是其中一个字段是多余的。 没有覆盖,你有两个支持字段,你通过属性访问哪一个将取决于你用来访问它的表达式的编译时类型。

    【讨论】:

    • 换句话说,我总是有 2 个支持字段,new 两个都用。
    【解决方案2】:

    如果您忘记了override/new,Value 的作用就像您将new 放在它前面一样。

    【讨论】:

      【解决方案3】:

      这取决于你的目标。如果您正在创建一个“新”方法,您实际上可以省略“新”关键字,而只处理警告。为清楚起见,存在“新”。

      另一方面,如果您打算覆盖继承的虚方法,省略“覆盖”实际上最终会创建一个“新”方法,而继承的方法不会被覆盖。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多