我看了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
}
我知道你前面问过这个,给你演示下大概的逻辑关系
------解决思路----------------------
这是面向对象程序设计基本特征中的“多态”的概念(相信你从一开始就知道面向对象基本特征),因此无需解释。就好像人家跟你说“我今天上街买了一双鞋”,你难道非要跟人家争论“棕色鞋不是鞋、男鞋不是鞋、休闲鞋不是鞋”吗?难道人家还得说话时处处小心翼翼地给你解释清楚、而不能使用抽象的“鞋”这么一个字吗?
设计类型 XmlReader 干什么?就是用来抽象化其各种派生类的。你在读文档时看到人家写到“返回 XXX 类型”就非要纠结这个名词儿而不能接受派生类的对象,这就相当于纠结于“休闲鞋不是鞋”。
------解决思路----------------------
我不认为是这样的关系,所以用这个比喻,更加容易造成lz的误解。
抽象化,以及分类,都是“概念性”的。例如说“白马也是马”并不是说“白马的肚子里必须住着一匹马”。因此用“放在饭碗里边的是(或者不是)碗”来比喻“抽象化——具体化”继承概念,跟那种把程序设计的继承关系比喻为“儿子继承父母的遗产”犯了同样的错误,把组合关系滥用成为了继承关系,这反而会造成许多诡异的结果。