(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 */
相关文章推荐
- 关于在前台页面插入C#代码的问题,导致页面不完全显示
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 关于c#的unity3d中双问号操作符(??)无法正确判断null值的问题
- 一道有趣的题,关于C#的多态
- 关于简单的c#编程问题
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案
- 一道看似复杂但是简单的c#面试题
- Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案
- 一道关于finally的看似非常简单但很多人都做错的Java面试题
- ios关于点击事件selector传参的问题,看似简单却容易混淆(已解决)
- C#中关于timer的简单问题
- 一道简单的C++笔试题,关于抽象shape类求图形周长的问题~
- 关于用OE收发邮件帐户密码信息完全正确时仍出问题的解决方法
- 关于《你必须知道的.net》第六回的问题--IL和C#看似不一致的地方
- 黑马程序员 关于c# windows窗体关闭时线程未能完全退出问题(专题一)
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 关于c# 中“正在终止线程”的问题
- 关于JAVA的简单问题(NO1)
- 关于php运算符优先级问题(php不完全遵守运算符优先级)