从派生类的对象调用基类属性而不将其标记为虚拟

时间:2011-01-20 05:59:53

标签: c# oop

如何从类b的对象调用类a的x而不将类a的x标记为虚拟。 是否可能

public class a { public int x { get; set; } }
public class b : a { public int x { get; set; } }

public class c {
    a _a = new a();
    b _b = new b();
    public c()
    {
        int y=_a.x;
        y=_b.x;
        _b.x = y;
    }
}

3 个答案:

答案 0 :(得分:4)

base.x()应该在b类型内部工作(但这不是您在此处所拥有的)。

在“方法隐藏”方案(你拥有的)中,它在很大程度上取决于变量键入,因此转换为a应该有效:

a tmp = _b;
tmp.x = ... // talks to a.x, not b.x

或更简洁:

((a)_b).x = ... // talks to a.x, not b.x

答案 1 :(得分:2)

使用类型转换:

public class c
{
  a _a = new a();
  b _b = new b();

  void Test() {
    int y = _b.x; // This is "x" of "b"
    a _b_as_a = (a)_b;
    int z = _b_as_a.x; // This is "x" of "a" of "b"
  }
}

答案 2 :(得分:0)

除了类型转换(如上所述,虽然如果你不知道它的父类的类型就行不通)你不能,所以我建议重新构造其中一个类。您应该将x虚拟化,或将类b中的属性x更改为不同的属性,或者在b的x实现中调用base.x。