当前位置: 代码迷 >> C# >> XmlReader.Read 方法是abstract,如何可以不经override直接使用
  详细解决方案

XmlReader.Read 方法是abstract,如何可以不经override直接使用

热度:189   发布时间:2016-05-05 04:45:39.0
XmlReader.Read 方法是abstract,怎么可以不经override直接使用?
我看了msdn,关于XmlReader.Read 方法的语法说明如下:
public abstract bool Read()
abstract的意思也就是类似c++中的纯虚函数吧,意味着本身无方法实体,在派生类中必须被重新实现,可下面的代码并没有派生XmlReader类,却仍然可以正常实现read的功能,这是为何???
Form1.cs
using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Text;
  using System.Windows.Forms;
  using System.Xml;

  namespace XmlReaderClass
  {
       public partial class Form1 : Form
       {
            public Form1()
            {
                InitializeComponent();
            }

             private void Form1_Load(object sender, EventArgs e)
             {
                 string strXmlPath = "XMLFile.xml";
                 XmlReader xml_reader = XmlReader.Create(strXmlPath);
                 while (xml_reader.Read())
                 {

           //获取当前节点的类型,如果当前读取的节点是文本类型就输出文本信息
           if (xml_reader.NodeType == XmlNodeType.Text)
                        {
                            this.label1.Text += xml_reader.Value + "\r\n";
                        }
                }
                }

XMLFile.xml
<?xml version="1.0" encoding="utf-8" ?>
   <BookShops>
     <Book Number="product-001">
        <Name>西游记</Name>
        <OthorName>大唐西游传</OthorName>
        <Author>吴承恩</Author>
        <Money>220</Money>
        <Details>
        东胜神州的傲来国花果山的一块巨石孕育出了一只明灵石猴,石猴后来拜须菩提为师后习得了七十二变,具有了通天本领,于是占山为王,自称齐天大圣。
        </Details>
     </Book>
     <Book Number="product-002">
        <Name>红楼梦</Name>
        <OthorName>石头记</OthorName>
        <Author>曹雪芹</Author>
        <Money>320</Money>
        <Details>
         女娲炼石补天,所炼之石剩一块未用,弃在大荒山无稽崖青埂峰下。此石“自经煅炼之后灵性已通”,因未被选中补天常悲伤自怨。一日,和尚茫茫大士、道士渺渺真人经过此地。
        </Details>
     </Book>
  </BookShops>

------解决思路----------------------
xml_reader这个是XmlReader的具体子类
------解决思路----------------------

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楼用reader的create的实现代码解释了xmlreader的create的实现,非常清楚。其实我发帖前也是这么想的,认为create一定返回了xmlreader的派生类,但我又反复看了msdn,发现没任何一句话解释这个问题,觉得这可能是msdn的疏忽了,但小弟是初学,还没资格质疑msdn,因此发帖质疑下,麻烦各位学兄了。其实我这个帖确实是在钻牛角尖了。

以下为为msdn关于create函数的解释:
返回值
类型:System.Xml.XmlReader
用于读取 XML 数据的 XmlReader 对象。


这是面向对象程序设计基本特征中的“多态”的概念(相信你从一开始就知道面向对象基本特征),因此无需解释。就好像人家跟你说“我今天上街买了一双鞋”,你难道非要跟人家争论“棕色鞋不是鞋、男鞋不是鞋、休闲鞋不是鞋”吗?难道人家还得说话时处处小心翼翼地给你解释清楚、而不能使用抽象的“鞋”这么一个字吗?

设计类型 XmlReader 干什么?就是用来抽象化其各种派生类的。你在读文档时看到人家写到“返回 XXX 类型”就非要纠结这个名词儿而不能接受派生类的对象,这就相当于纠结于“休闲鞋不是鞋”。
------解决思路----------------------
引用:
放在饭碗里的不一定是饭,所以 XmlReader?中是什么,楼主太想当然了.


我不认为是这样的关系,所以用这个比喻,更加容易造成lz的误解。

抽象化,以及分类,都是“概念性”的。例如说“白马也是马”并不是说“白马的肚子里必须住着一匹马”。因此用“放在饭碗里边的是(或者不是)碗”来比喻“抽象化——具体化”继承概念,跟那种把程序设计的继承关系比喻为“儿子继承父母的遗产”犯了同样的错误,把组合关系滥用成为了继承关系,这反而会造成许多诡异的结果。
  相关解决方案