【问题标题】:C# always call a base method from the base classC# 总是从基类调用基方法
【发布时间】:2015-03-30 03:06:37
【问题描述】:

假设我们有以下类:

class A {
   public virtual int Number { get { return 1; } }

   public int Foo(){
      return Number;
   }
}

class B : A{
   public override int Number { get { return 2; } }
}

正如预期的那样,如果我在 B 类的实例上调用 Foo 方法,我将得到 2。是否可以更改 Foo 方法以使其始终使用基 A.Number财产(并返回 1)?类似的东西:

public int Foo(){
   return A.Number; 
}

【问题讨论】:

  • 注意:这个问题不是如何调用基础方法(例如,如果它与当前方法同名),而是如何防止多态调度虚拟会员。
  • 你是对的。我可以吗?
  • “也许”,虽然可能并不像预想的那样 - 因为它打破了运行时多态性背后的概念(重要的是 actual 对象,而不是表达式类型)。你可以做class B : A { public new int Number { get { return 2; } }。在这种情况下,b 是表达式键入为 Bb.Number 将返回 2,但 ((A)b).Number(和 b.Foo())将返回 1(不是 2)。请注意这对A b2 = b; b2... 的影响。

标签: c# overriding


【解决方案1】:

您试图将“真实”功能放在虚拟成员中,并让非虚拟成员以非虚拟方式公开它。那……真的不行。也就是说,您需要做的就是颠倒这个概念:

class A
{
    public virtual int Number { get { return Foo(); } }

    public int Foo()
    {
        return 1;
    }
}

“真正的”定义在非虚拟成员中,虚拟成员简单地调用它。这可确保您只编写一次功能,同时仍然在虚拟和非虚拟庄园中公开它。

【讨论】:

  • 这是我目前的解决方案。我只是想知道我是否可以以某种方式强制 Foo 方法始终调用基本属性。
【解决方案2】:

你可以使用“base”来使用A类的方法和属性。

class B : A
    {
        public override int Number { get { return 2; } }

        public new int Foo()
        {
            return base.Number;
        }
    }

【讨论】:

  • 在以下示例中:A a = new B(); var foo = a.Foo() foo 将是 2,而不是 1;它应该是1。此外,此方法依赖于 A 的每个子类型添加此实现(并使其正确),这是不现实的期望。
  • 是的,你可能是对的。我已经理解,请求只是将 A 类的属性 Number 用于 B 类的方法 Foo :)
  • B 没有没有Foo方法。要求是使用来自类ANumber 定义,来自类AFoo 方法,即使该方法是在恰好是B 类型的实例上调用的。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2011-03-07
相关资源
最近更新 更多