首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 类中base和this的有关问题,求帮忙

2013-09-06 
C# 类中base和this的问题,求帮忙using Systemusing System.Collections.Genericusing System.Linqusing

C# 类中base和this的问题,求帮忙

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

namespace CLR_TEST1
{
    public class BaseClass
    {
        public virtual void Print()
        {
            Console.WriteLine(this.GetType().FullName);
            Console.WriteLine("BaseClass Print");
        }
    }
    public class DirClass : BaseClass
    {
        public override void Print()
        {
            base.Print();
            Console.WriteLine(base.GetType().FullName);
            Console.WriteLine("DirClass Print");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            DirClass b = new DirClass();
            b.Print();
            Console.Read();
        }
    }
}

我期待的结果是:
CLR_TEST1.BaseClass
BaseClass Print
CLR_TEST1.BaseClass
DirClass Print

可结果是:
CLR_TEST1.DirClass 
BaseClass Print
CLR_TEST1.DirClass 
DirClass Print

这是为什么? c# base this
[解决办法]

引用:
Quote: 引用:

如果非要说出道理,就是你必须理解,人是动物的含义就是人是一种具体的动物,而不是人的肚子中还装着一个动物。尽管可能语言/框架库的实现可能具有这样的堆积,但是从概念上来说,不存在在当前类型中还有一个基类的类型。继承后只有一个类型。


你好,是不是可以这样理解,GetType的方法是属于Object类的,也就是说GetType是在Object类型对象的方法表里面,又由于DirClass的实例在托管堆上对应的内存,其实是包括基类中的一些内容(比如基类的实例字段),也就是说无论在DirClass中Print方法用的是this,或者 base,指的都是当前DirClass的实例,即运行实例,我可能讲不清楚,我只能这样理解了,不知对不对

我觉得你说得挺对的。MSDN上说:Gets the Type of the current instance.关键是the current instance.
[解决办法]
对于常用的控件,基本都有五六层的继承,但无论有多少层,this 作为实例肯定只有一个。
base 其实与类无关,只是方便调用基类的方法的一种语法,以前 C++ 时要用【基类类名::方法名】调用的。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

如果非要说出道理,就是你必须理解,人是动物的含义就是人是一种具体的动物,而不是人的肚子中还装着一个动物。尽管可能语言/框架库的实现可能具有这样的堆积,但是从概念上来说,不存在在当前类型中还有一个基类的类型。继承后只有一个类型。


你好,是不是可以这样理解,GetType的方法是属于Object类的,也就是说GetType是在Object类型对象的方法表里面,又由于DirClass的实例在托管堆上对应的内存,其实是包括基类中的一些内容(比如基类的实例字段),也就是说无论在DirClass中Print方法用的是this,或者 base,指的都是当前DirClass的实例,即运行实例,我可能讲不清楚,我只能这样理解了,不知对不对

我觉得你说得挺对的。MSDN上说:Gets the Type of the current instance.关键是the current instance.

是不是可以这样理解,无论你实例哪一个引用类型,即使这个引用类型有N层继续关系,子类实例时会调用父类的构造函数,这个调用父类的构造函数过程并不是指在堆上单独的去创建了父类的实例,而是说,实例一个子类,堆上只会分配创建子类需要的一些内存,调用父类的构造函数只不过是在已分配给子类对象内存中去初始父类的实例字段,子类的实例对象方法内部用base其实是在子类对象内存块中去引用父类的一些特性,但其实对于运行实例来讲就只有子类对象一个,对于GetType是子类要一直回溯到System.Object类型对象中方法表中才能找到的方法,这个方法的返回的是当前堆上调用他的对象的TYPE,虽然base指的是引用子类对象内部父类的特性,但他还是属于当前子类对象的?


在你讨论问题的时候,一定要分清概念和实现。从实现上说,肯定一个继承的类型包含了基类的所有信息的存储。但是无论什么OOP语言,都不会出现继承的类中还套着一个基类这样的概念。
[解决办法]
public class BaseClass
    {
        protected object o = 1;
        public virtual void Print()
        {
            Console.WriteLine(o.GetType());
            Console.WriteLine(this.GetType().FullName);
            Console.WriteLine("BaseClass Print");
        }


    }
    public class DirClass : BaseClass
    {
        new object o = "2";
        public override void Print()
        {
            base.Print();
            Console.WriteLine(o.GetType());
            Console.WriteLine(base.o.GetType());//注意这里~!可以指向父类的成员,但为什么base.GetType()是指向当前,我也不知道了~
            Console.WriteLine("DirClass Print");
        }
    }

public virtual void Print()
        {
            Console.WriteLine(this.GetType().FullName);
            Console.WriteLine("BaseClass Print");
        }
你这个是方法列表,没有用到成员变量
无论实例化多少,方法列表只有一份~而且this只指向当前的调用者
[解决办法]

引用:
Quote: 引用:

public class BaseClass
    {
        protected object o = 1;
        public virtual void Print()
        {
            Console.WriteLine(o.GetType());
            Console.WriteLine(this.GetType().FullName);
            Console.WriteLine("BaseClass Print");
        }
    }
    public class DirClass : BaseClass
    {
        new object o = "2";
        public override void Print()
        {
            base.Print();
            Console.WriteLine(o.GetType());
            Console.WriteLine(base.o.GetType());//注意这里~!可以指向父类的成员,但为什么base.GetType()是指向当前,我也不知道了~


            Console.WriteLine("DirClass Print");
        }
    }

public virtual void Print()
        {
            Console.WriteLine(this.GetType().FullName);
            Console.WriteLine("BaseClass Print");
        }
你这个是方法列表,没有用到成员变量
无论实例化多少,方法列表只有一份~而且this只指向当前的调用者


谢谢你的回复,this.GetType()这个比较好理解
但base.GetType()返回的还是子类的类型,这点难理解,111楼版主大大讲的太深奥了
我也不明白,呵呵,我在网上好像都搜不到这样类似的问题
难道是这问题太EASY了?想知道大家对这个问题的理解

如果你学过编译原理,如果你了解c++对象模型,你就不会奇怪了。
gettype不是虚函数,你的类并没有把他“替换”,所以他只能去掉用object的gettype,而且可以推测object的gettype会根据传入this指针确定如果输出
其实在最新版的《编译原理》那本书提到了.net面向对象部分的实现传承c++的方式

热点排行