你看下XmlReader.Create出来的这个 xml_reader 的具体类型就知道了

解决方案 »

  1.   

    xml_reader这个是XmlReader的具体子类
      

  2.   


    public abstract class Reader
    {
        public abstract bool Read();
        public static Reader Create()
        {
            ReaderDummy rd = new ReaderDummy();
            return rd.CreateReader();
        }
    }
    public class ReaderDummy
    {
        public Reader CreateReader()
        {
            ReaderImpl reader = new ReaderImpl();
            return reader;
        }
    }
    public class ReaderImpl : Reader
    {
        public override bool Read()
        {
            return true;
        }
    }
    /////////////////////////////////////////////////////////////////////
    {
        Reader reader = Reader.Create();
        reader.Read(); // 调用的是 ReaderImpl.Read
    }我知道你前面问过这个,给你演示下大概的逻辑关系
      

  3.   

    放在饭碗里的不一定是饭,所以 XmlReader 中是什么,楼主太想当然了.
      

  4.   

    3楼用reader的create的实现代码解释了xmlreader的create的实现,非常清楚。其实我发帖前也是这么想的,认为create一定返回了xmlreader的派生类,但我又反复看了msdn,发现没任何一句话解释这个问题,觉得这可能是msdn的疏忽了,但小弟是初学,还没资格质疑msdn,因此发帖质疑下,麻烦各位学兄了。其实我这个帖确实是在钻牛角尖了。以下为为msdn关于create函数的解释:
    返回值
    类型:System.Xml.XmlReader
    用于读取 XML 数据的 XmlReader 对象。
      

  5.   


    这是面向对象程序设计基本特征中的“多态”的概念(相信你从一开始就知道面向对象基本特征),因此无需解释。就好像人家跟你说“我今天上街买了一双鞋”,你难道非要跟人家争论“棕色鞋不是鞋、男鞋不是鞋、休闲鞋不是鞋”吗?难道人家还得说话时处处小心翼翼地给你解释清楚、而不能使用抽象的“鞋”这么一个字吗?设计类型 XmlReader 干什么?就是用来抽象化其各种派生类的。你在读文档时看到人家写到“返回 XXX 类型”就非要纠结这个名词儿而不能接受派生类的对象,这就相当于纠结于“休闲鞋不是鞋”。
      

  6.   

    用“放在饭碗里边的是(或者不是)碗”来比喻 -->  用“放在饭碗里边的是(或者不是)饭”来比喻如果思维方式里本身就没有“抽象-扩展”的概念模型,而使用组合的方式来理解编程上的继承概念,可能貌似理解了 XmlReader 类型,但是将来还是会产生更多诡异的新概念新错误出来。继承概念,不能用组合概念来“比喻”。继承所要解决的、所说的不是“碗和饭”的关系,而是“碗和花碗、和瓷碗”的关系。