2012-09-04 65 views
4

鉴于2种类型使用一个派生类对象访问一个重写基类成员(C#)

class A { public virtual void Hello() { Console.WriteLine("A"); } } 
class B : A { public override void Hello() { Console.WriteLine("B"); } } 

和 'B' B b = new B();

能访问的AHello()方法通b的一个实例? (我可以想到在B中暴露A属性,但不知道是否有另一种方式)

我知道这是可能的c++,但在c#中我的脑袋挠了挠头。

PS:请不要谈论'你为什么要这样?'或“这是一个糟糕的设计”等。

回答

9

不是从外面看。

从内的,实例可以调用,通过base.Hello(),所以你可以添加一个:

public void Foo() { base.Hello(); } 
+0

哈..所以我问了一个问题,即使是马克答不上来,哈哈:)。 我知道'基地',但想知道从外面访问。 –

+4

@AntonyThomas哦,我可以回答:答案是:“不从外面”。如果你试图通过在IL中静态调用它来作弊,那么CLI将会抛出一个“操作可能会破坏运行时的稳定性”。它**不会让你**做到这一点。 –

+0

所以,我想我可以通过'B'中的propery将'base'('A')公开为'public A aProperty {get {return base; }}'但编译器抱怨。那么我是否可以通过**派生的**来揭示**基**? –

1

这是不可能在C#。抱歉。

1

您可以尝试阴影:

class A { public virtual void Hello() { Console.WriteLine("A"); } } 
class B : A { public new void Hello() { Console.WriteLine("B"); } } 

然后,你可以这样做:

 A b = new B(); 
     b.Hello(); //prints A 
     (B)b).Hello(); //prints B 

     B b1 = new B(); 
     b1.Hello(); //prints B 
+0

这很有趣。我认为'override'和'new'的行为应该是一样的。你能否给我技术性的解释,为什么会发生这种情况? –

+2

@Antony与'new',第二个'Hello'(在'B')是在一个*完全独立的* V表的记录等;与多态性完全无关 - 基本上,只是碰巧具有相同名称的方法。通常,这种(方法隐藏)是不鼓励的。 –

相关问题