您的位置:首页 > 编程语言 > C#

(C#)一道看似简单却很难答得完全正确的关于多态的问题

2012-09-14 16:20 489 查看
/*关于virtual,overried,new在方法和属性上以this,base形式输出的问题
*问主程序的输出是什么
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
A a1 = new B();
a1.AM1();
B b1 = (B)a1;
b1.AM1();

Console.WriteLine();

A a2 = new B();
a2.AM2();
B b2 = (B)a2;
b2.AM2();
}
}

class A
{
public virtual int i { get; protected set; }
public A()
{
this.i = 9;
}

public virtual void AM1()
{
this.i = this.i + 10000;
Console.WriteLine("A.this.i="+ this.i);
}

public virtual void AM2()
{
this.i = this.i + 10000;
Console.WriteLine("A.this.i=" + this.i);
}
}
class B : A
{
public override int i { get; protected set; }
public B()
: base()
{
this.i = 5;
}

public override void AM1()
{
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
this.i = this.i + 100;
base.i = base.i + 1000;
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
}

public new void AM2()
{
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
this.i = this.i + 100;
base.i = base.i + 1000;
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
}
}
}
/* output
B.this.i=5
B.base.i=0
B.this.i=105
B.base.i=1000
B.this.i=105
B.base.i=1000
B.this.i=205
B.base.i=2000

A.this.i=10005
B.this.i=10005
B.base.i=0
B.this.i=10105
B.base.i=1000
*/

/*关于virtual,overried,new在方法和属性上以this,base形式输出的问题
*问主程序的输出是什么
*加了些log后
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
A a1 = new B();
a1.AM1();
B b1 = (B)a1;
b1.AM1();

Console.WriteLine();

A a2 = new B();
a2.AM2();
B b2 = (B)a2;
b2.AM2();
}
}

class A
{
private int tmp;
public virtual int i
{
get
{
Console.WriteLine("      A.i.get=" + this.tmp);
return this.tmp;
}
protected set
{
Console.WriteLine("      A.i.set=" + value);
this.tmp = value;
}
}
public A()
{
this.i = 9;
}

public virtual void AM1()
{
this.i = this.i + 10000;
Console.WriteLine("A.this.i=" + this.i);
}

public virtual void AM2()
{
this.i = this.i + 10000;
Console.WriteLine("A.this.i=" + this.i);
}
}
class B : A
{
private int tmp;
public override int i
{
get
{
Console.WriteLine("      B.i.get=" + this.tmp);
return this.tmp;
}
protected set
{
Console.WriteLine("      B.i.set=" + value);
this.tmp = value;
}
}
public B()
: base()
{
this.i = 5;
}

public override void AM1()
{
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
this.i = this.i + 100;
base.i = base.i + 1000;
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
}

public new void AM2()
{
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
this.i = this.i + 100;
base.i = base.i + 1000;
Console.WriteLine("B.this.i=" + this.i);
Console.WriteLine("B.base.i=" + base.i);
}
}
}
/* output
B.i.set=9
B.i.set=5
B.i.get=5
B.this.i=5
A.i.get=0
B.base.i=0
B.i.get=5
B.i.set=105
A.i.get=0
A.i.set=1000
B.i.get=105
B.this.i=105
A.i.get=1000
B.base.i=1000
B.i.get=105
B.this.i=105
A.i.get=1000
B.base.i=1000
B.i.get=105
B.i.set=205
A.i.get=1000
A.i.set=2000
B.i.get=205
B.this.i=205
A.i.get=2000
B.base.i=2000

B.i.set=9
B.i.set=5
B.i.get=5
B.i.set=10005
B.i.get=10005
A.this.i=10005
B.i.get=10005
B.this.i=10005
A.i.get=0
B.base.i=0
B.i.get=10005
B.i.set=10105
A.i.get=0
A.i.set=1000
B.i.get=10105
B.this.i=10105
A.i.get=1000
B.base.i=1000
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐