动态多态性的奇怪输出

时间:2017-03-22 05:59:19

标签: c# inheritance dynamic polymorphism

我无法理解输出。我有两节课,

class A
{
    public int i = 1;

    public virtual void Print()
    {
        Console.WriteLine("I am A");
    } 
}

class B:A
{
    public int i =2 ; 

    public override void Print()
    {
        i++;
        Console.WriteLine("I am B");
    }

}

现在,当我运行以下代码时,

A a1 = new PolymorphismInDepth.B();
        a1.Print();
        Console.WriteLine(a1.i);

我得到以下输出,

我是B

1

为什么我得到1?为什么不2?

2 个答案:

答案 0 :(得分:2)

基类对象<html ng-app='myApp'> <body ng-controller="ctrl1"> <div> Room: <input type='button' value='-' ng-click=minusRoom()> <input type='text' ng-value="room" readonly="readonly"> <input type='button' value='+' ng-click=addRoom()> Adult: <input type='button' value='-' ng-click=minusAdult()> <input type='text' ng-value="adult" readonly="readonly"> <input type='button' value='+' ng-click=addAdult()> Child: <input type='button' value='-' ng-click=minusChild()> <input type='text' ng-value="child" readonly="readonly"> <input type='button' value='+' ng-click=addChild()> <br> </div> <h3>{{price}}</h3> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> </body> </html>指向内存中的Derived对象。因此,a1会调用方法引用,即a1.Print(),但您无法使用此B().Print()访问B().i

你需要施展它:

A().i

您很困惑,因为您使用了相同的变量名称。试试这个:

Console.WriteLine(((B)a1).i);

尝试像这样访问class A { public int ai = 1; public virtual void Print() { Console.WriteLine("I am A"); } } class B : A { public int bi = 2; public override void Print() { bi++; Console.WriteLine("I am B"); } } static void Main(string[] args) { A a1 = new B(); a1.Print(); Console.WriteLine(a1.ai); Console.WriteLine(((B)a1).bi); Console.Read(); } 会给你一个编译时错误:

bi

<强>更新

要添加答案 - 还可以实现这样的覆盖基类成员变量行为的实现:

Console.WriteLine(a1.bi); //ERROR: 'A' does not contain a definition for 'bi'...

输出:

  

我是B

     

3

     

3

答案 1 :(得分:0)

除了萨迪克所说的话。如果你将你的类标记为公共和构建,你会看到该编辑器在类B中为变量i指示了某些东西。它表示你隐藏了基础成员I​​并且应该用new关键字覆盖。

所以,如果你删除public int i = 2;从B类开始,当你修改基础变量时,输出为2。但是如果你在B中声明新的i,那么你将在B中创建单独的新i范围。

如果您将调试器放在行Console.WriteLine(a1.ai);上,那么使用当前代码 它清楚地显示了两个i变量,一个值为1,另一个值为2.值2表示类型B.所以只有当你从B的实例中引用i时才会得到2。

希望这会让人怀疑。