【问题标题】:New Modifier is not hiding Base class member新修饰符不隐藏基类成员
【发布时间】:2014-09-10 12:12:01
【问题描述】:

我在new 修饰符关键字上有一个问题,下面将详细解释。

public abstract class RangeBase
{
    public event RoutedPropertyChangedEventHandler<int> ValueChanged;
    public int Minimum { get; set; }

    public void OnValueChanged(int oldValue, int newValue)
    {
        ValueChanged(this, new RoutedPropertyChangedEventArgs<int>(1, 2));
    }
}

RangeBase 是一个abstract class,定义了一个RoutedPropertyChangedEventHandler 类型的int,一个属性Minimum 类型int 和一个方法OnValueChanged,它接受两个int 参数。

public class MyRange : RangeBase
{
    public new event RoutedPropertyChangedEventHandler<double> ValueChanged;

    public new double Minimum { get; set; }

    public new void OnValueChanged(double oldValue, double newValue)
    {
        ValueChanged(this, new RoutedPropertyChangedEventArgs<double>(1, 2));
    }
}

RangeBase派生的MyRange类也定义了一组新的membersmethods,它们的基类成员名称相同,但这里的类型是double,并用new修饰符关键字标记.忘记Generics这里....现在让我解释一下真正的问题。

new 关键字标记的成员和属性隐藏了同名的BaseClass 成员和属性。除了OnValueChanged 方法之外,这也适用于我。 Intellisense 仍然公开DerivedBaseOnValueChanged 类型intdouble 的方法。这里我可以在BaseClass 中隐藏int 类型的Minimum 属性和Dervied Classdouble 类型的Minimum 属性。但它不适用于OnValueChanged 方法。谁能解释为什么new 关键字在这种情况下不起作用。提前致谢!!!

【问题讨论】:

  • 超载了,不需要new关键字。
  • 问题背后的问题:这不是继承的好案例。
  • @RohitVats 我已经在 sn-p 中定义了一个名为 Minimum 的属性,具有不同的类型
  • @YuliamChandra 我同意这是超载的。但是新关键字是什么意思
  • @VimalCK,我已经解释过,“当实例是派生类型并且保存实例的变量类型也是派生类型时,它只是隐藏基成员,检查this post

标签: c# .net wpf oop


【解决方案1】:

您不能隐藏签名不同的方法,它将被视为方法重载而不是method hiding

  • 类或结构中引入的常量、字段、属性、事件或类型会隐藏所有同名的基类成员。

  • 类或结构中引入的方法隐藏了所有同名的非方法基类成员,以及所有具有相同名称的基类方法 相同的签名(方法名称和参数计数、修饰符和 类型)。

  • 在类或结构中引入的索引器会隐藏所有具有相同签名(参数计数和类型)的基类索引器。

【讨论】:

  • 好吧,我遇到了同样的问题,我的签名也是一样的。看看:dotnetfiddle.net/vYz2weIntellisence,当输入 .Test( 时,也会显示 SomeService 方法和 SomeAbstractService 方法。
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多