初学者,问题浅薄,基础不够。还望见谅!
Base_Class baseclass = new Derived_Class();
Derived_Class derivedclass = new Derived_Class(); 在内存中的代码段有区别吗?前面的声明不同究竟导致他们的区别在哪里?
在调用基类和父类中的方法时局限性体现在哪?
(我是在看overide和new的区别时被弄纠结的。)还请大家讲解一下,麻烦了。
Base_Class baseclass = new Derived_Class();
Derived_Class derivedclass = new Derived_Class(); 在内存中的代码段有区别吗?前面的声明不同究竟导致他们的区别在哪里?
在调用基类和父类中的方法时局限性体现在哪?
(我是在看overide和new的区别时被弄纠结的。)还请大家讲解一下,麻烦了。
第十五回:继承本质论
[你必须知道的.NET]第十九回:对象创建始末(下)
LZ,Override是重写的意思。Base_Class baseclass = new Derived_Class(); 一个基类的的声明指向一个子类的实现。new是重写分配了内存空间,有没实现还的看具体实现。
比如说:举个例子:new是覆盖override是重载。 “覆盖”并不意味着“删除” 示例
using System;
class A
{
public void F()
{
Console.WriteLine( "A.F ");
}
}
class B: A
{
new public void F()
{
Console.WriteLine( "B.F ");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出为
B.F
A.F 但“重载”意味着“删除”,这就是“覆盖”和“重载”的区别。 示例
using System;
class A
{
public virtual void F()
{
Console.WriteLine( "A.F ");
}
}
class B: A
{
public override void F()
{
Console.WriteLine( "B.F ");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出的为
B.F
B.F
但是我突然有个小小的问题。结合你俩的讲解
如果在ZhiZhuoChangeIng 的代码中我增加一下这段:class C:A
{
public override void F()
{
Console.WriteLine( "C.F ");
}
}按照我对wanghui0380 的这段话的理解
“overide 修改的是stack 代码段部分,但loderHeap堆中方法表没有更改,他任然指向stack相同偏移量的位置,但是stack那个位置的代码被修改了,我个人把这叫做“偷梁换柱”,不管怎么说材料已经变了。”是说这是之前class B 的override那段代码是也应该被覆盖了是吗?我可以理解我一标明了vitural就相当于我在stack里留了一段空,让我的继承者来填充?
我琢磨着我理解的不对。。因为这样的话,在测试类 class Test中我既不是不可以调用B.F()?谢谢(最后纪念一下我没有看到的一楼)
具体可以看这里
http://www.cnblogs.com/TextEditor/archive/2010/05/25/1743539.html
具体可以看这里http://www.cnblogs.com/TextEditor/archive/2010/05/25/1743539.htmlps:我们的确可以在c里调用B的F()方法,因为我们有base关键字,你在C的F里使用Base关键字就可以就近调用上一层的同名方法
public override void F()
{ Base。F();
Console.WriteLine( "C.F ");
}
但子类的皮不能包含基类的实例object o=new Customer();//ok
Customer c=new object();//error
Customer c=new object();//errorandCustomer c=o;//ok 此种情况是通过基类做中转,面向对象的基础操作