class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }
只不过在代码被call(调用)时.net环境为它实现好了 this 关键字的引用,从而你在方法里的所有关于“当前对象”的引用都动态设置好了。这个this应该就是你所谓的“子类环境”。而实际的实现机制其实异常简单,就是由CLR设置好 this 就行了,并不会低效率地真去“拷贝”一大堆东西。
#7
那么类继承时,类的成员属性不会被覆盖吗?
为何 C# 与其他面向对象的语言不一样呢?
#8
那么对于base.XXX 等等调用也是一样,只要动态地设置好 this 就能准确实现面向对象机制。其实一个方法不论是定义在父类还是子类,都是可以被任何其它代码调用的(从这个角度看,面向对象机制在底层完全是基于结构化类库机制的),编译器来判断你的源代码中的base.XXX等调用的类型是否合法、是否兼容。而运行时CLR来负责设置正确的this指针,告诉你的代码“当前的对象环境”。
#4楼贴出的 public new void show() 这类代码,这是违背面向对象编程原则的。如果说.net的这个机制是“ C# 与其他面向对象的语言不一样”,你也可以这样说。但是这并不是为了实现面向对象技术而有的!
实现这样的东西,应该是15年前考虑与微软自己的c++开发平台相兼容,为了将c++程序员引入c#平台。这个语法应该算是个“糟粕”。既然明知道 A 类的 show 方法是个异类而特意要写 new 关键字来声明,那么为什么不直接为 A 的这个与父类show毫无关系的方法另外起个名字(例如叫做show1)呢?
class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }
你这是在偷梁换柱
#13
真的是你们说的那样吗?
class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }
public class A { public int a = 1; public void show() { MessageBox.Show(a.ToString()); } }
public class B : A { }
public class Form1:Form { private void button2_Click(object sender, EventArgs e) { B b = new B(); b.a = 2; b.show();//此处显示的是2,而不是1 }
你new int a
其实就相当于int b
那么你修改了b的值,却打印a的值,这跟继承有什么关系,完全是逻辑上的错误
#1
继承后的对象是一个有机的整体。
好比亚洲象是大象的一种,不是说每只亚洲象的肚子里藏着一只大象。
#2
如果要是派生类自己还有一套“环境参数”,那它还要继承基类干嘛。
#3
成员函数也不过是个函数
这跟写成public static形式的函数有什么区别吗
函数的参数是你自己传进去的啊
除非函数代码里还用到了外部变量
#4
真的是你们说的那样吗?
class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }
只不过在代码被call(调用)时.net环境为它实现好了 this 关键字的引用,从而你在方法里的所有关于“当前对象”的引用都动态设置好了。这个this应该就是你所谓的“子类环境”。而实际的实现机制其实异常简单,就是由CLR设置好 this 就行了,并不会低效率地真去“拷贝”一大堆东西。
#7
那么类继承时,类的成员属性不会被覆盖吗?
为何 C# 与其他面向对象的语言不一样呢?
真的是你们说的那样吗?
不矛盾
你这个父类函数里用到了父类的成员变量,这个变量对于这个函数来说是个外部变量
#8
那么对于base.XXX 等等调用也是一样,只要动态地设置好 this 就能准确实现面向对象机制。其实一个方法不论是定义在父类还是子类,都是可以被任何其它代码调用的(从这个角度看,面向对象机制在底层完全是基于结构化类库机制的),编译器来判断你的源代码中的base.XXX等调用的类型是否合法、是否兼容。而运行时CLR来负责设置正确的this指针,告诉你的代码“当前的对象环境”。
#4楼贴出的 public new void show() 这类代码,这是违背面向对象编程原则的。如果说.net的这个机制是“ C# 与其他面向对象的语言不一样”,你也可以这样说。但是这并不是为了实现面向对象技术而有的!
实现这样的东西,应该是15年前考虑与微软自己的c++开发平台相兼容,为了将c++程序员引入c#平台。这个语法应该算是个“糟粕”。既然明知道 A 类的 show 方法是个异类而特意要写 new 关键字来声明,那么为什么不直接为 A 的这个与父类show毫无关系的方法另外起个名字(例如叫做show1)呢?
class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }
你这是在偷梁换柱
#13
真的是你们说的那样吗?
class Program { static void Main(string[] args) { A p = new A(); p.show(); } }
class T { public int a = 1; public void show() { Console.WriteLine(a); } } class A : T { public new int a = 2; public int b = 3; public new void show() { Console.WriteLine("{0} {1}", a, b); base.show(); } }