我无法理解输出。我有两节课,
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?
答案 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。
希望这会让人怀疑。