上面2节我们已经很了解了程序应该具有的功能以及采用的算法,下面我们可以开始设计并实现程序了。
首先我们要有一些类来完成查询字符串从中缀到后缀的转换,将它们放在SearchEngine.Expression名字空间中:
- ExpressionEntry 类:用于存储查询串分割后的元素,可以看做一个包含元素值和类型的结构体
- ExpressionProcess 类:用于将中缀查询串转换成后缀查询串。
注:ExpressionEntry 类的两个属性分别存查询串元素的值和类型,例如a || b && c可以分割成5个元素:a、||、b、&&和c,分别可以存入5个ExpressionEntry 类的对象中,各对象的值就是元素本身,而它们的类型则分别为string、Or、 string、And、string。之所以要给它们分类,是因为这样可以减少后阶段在对逆波兰式进行运算时的复杂度,具体为什么请读者自己思考。将5个对象放入ArrayList中,形成的集合就可以代表一个表达式,并且中缀与后缀的转换就是改变个元素在集合中的位置。
//ExpressionEntry.cs using System; namespace SearchEngine public ExpressionEntry() public ExpressionEntry(string Entryvalue,string Entrytype) public string EntryValue |
//ExpressionProcess.cs using System; namespace SearchEngine public ExpressionProcess() public ExpressionProcess(string ex) public string Expression //返回拆分好的表达式节点集合,属性为中序表达式 tem=tem.Replace("!"," ! ");//在运算符两边加空格 tem=Regex.Replace(tem,@"/s+"," ");//将多个空格变为一个空格 string [] ExpressionEntries=Regex.Split(tem," ");
ArrayList Ex=getExpressionEntries();//得到中序节点集合 for(int i=0;i<Ex.Count;i++)//遍历中序节点集合
|
接下来我们要设计几个类来分别完成与(AndQuery)、或(OrQuery)、非(NotQuery)的查询,如果一次查询中即没有与,也没有或和非的运算,只有一个关键字,那么我们称之为关键字查询(NameQuery),将这些类放在SearchEngine.QueryClass名字空间中,并都继承自同一个基类Query:
- Query 类:作为所有查询类的基类,定义了一个查询结果集,一个查询结果集打印函数以及一个所有派生类必须独自实现的抽象函数Search( )。
- NameQuery 类:用于“关键字”查询,继承自Query类,拥有Query的成员和方法。
- AndQuery 类:用于“与”查询,继承自Query类,拥有Query的成员和方法。
- OrQuery 类:用于“或”查询,继承自Query类,拥有Query的成员和方法。
- NotQuery 类:用于“非”查询,继承自Query类,拥有Query的成员和方法。
- SearchResultCompare 类:为了使查询结果集中的SearchResultEntry类对象能够在ArrayList中排序,定此类并实现IComparer接口。SearchResultEntry类存储着查询的结果,每一个SearchResultEntry类的对象存储一条满足查询条件的记录,该类将在后面详细描述。
//Query.cs using System; namespace SearchEngine public Query() public ArrayList SearchResults//属性 public abstract void Search();//抽象函数 public void PrintSearchResult() } |
//NameQuery.cs using System; namespace SearchEngine
//带参数的构造函数 this.Search();//初始化完毕立即搜索 //属性 //属性 //重写Search函数:将包含有keyword的行写入结果集合 ArrayList result=new ArrayList(); } |
//AndQuery.cs using System; namespace SearchEngine //默认构造函数 //带参构造函数 this.Search();
public ArrayList Param2//属性 public override void Search() result.Sort(new SearchResultCompare());//将结果按照行号排序 this.SearchResults=result;//将结果写入最终结果 |
//OrQuery.cs using System; namespace SearchEngine //默认构造函数 //带参构造函数 this.Search();
public ArrayList Param2//属性 // result.Sort(new SearchResultCompare());//将结果按照行号排序 this.SearchResults=result;//将结果写入最终结果 |
//NotQuery.cs using System; namespace SearchEngine public NotQuery():base() //带参数的构造函数 this.Search();//初始化完毕立即搜索 public ArrayList UnNotResult//属性 //属性 //重写Search函数:将不含有keyword的行写入结果集合 ArrayList result=new ArrayList();//结果集合 tem=sr.ReadLine(); |
//SearchResultCompare.cs using System; namespace SearchEngine |
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
注:以上查询类中真正操作了文件的只是NameQuery类,它负责从文件中找出含有关键字的行,并生成SearchResultCompare对象存入结果集合,而其他查询类,诸如AndQuery、OrQuery、NotQuery等类只是在多个NameQuery的查询结果集上进行以、或、非的运算。
-
SearchText类:该类的每个对象绑定一个文件,并对文件进行查询操作。
-
SearchResultEntry类:该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果,每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容。
- SearchDoor类:定义程序的主函数。
//SearchText.cs
using System;
using System.Collections; using SearchEngine.QueryClass; using SearchEngine.Expression;
namespace SearchEngine
{ /// <summary> /// 该类提供了搜索文件的类实现 /// 搜索文件的类 /// </summary> public class SearchText { private string file_name; private ArrayList expression_entries; public SearchText() { FileName=""; ExpressionEntries=new ArrayList(); }
public SearchText(string filename,ArrayList expressionEntries)
{ FileName=filename; ExpressionEntries=(ArrayList)expressionEntries.Clone(); }
public string FileName
{ set{file_name=value;} get{return file_name;} }
public ArrayList ExpressionEntries
{ set{expression_entries=(ArrayList)value.Clone();} get { ArrayList al=(ArrayList)expression_entries.Clone(); return al; } }
public ArrayList getSearchResult()
{ if(this.FileName=="") { System.Console.WriteLine("没有指定查询的文件!"); return null; } if(this.expression_entries.Count==0) { System.Console.WriteLine("查询字符串为空!"); return null; }
ArrayList expression=this.ExpressionEntries;
ArrayList Stack=new ArrayList();
for(int i=0;i<expression.Count;i++)
{ ExpressionEntry ee=(ExpressionEntry)expression[i]; if(ee.EntryType.Equals("string")) { Stack.Add(new NameQuery(ee.EntryValue,this.FileName)); } else if(ee.EntryType.Equals("And")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new AndQuery(q1,q2));
} else if(ee.EntryType.Equals("Or")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new OrQuery(q1,q2));
} else if(ee.EntryType.Equals("Not")) { if(Stack.Count<1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new NotQuery(q,this.FileName));
} else { System.Console.WriteLine("表达式出现异常!"); return null;
}
} if(Stack.Count!=1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
return ((Query)Stack[0]).SearchResults;
}
public static void PrintSearchResult(ArrayList Result) { System.Console.WriteLine("查询结果:共找到{0}条记录。",Result.Count); System.Console.WriteLine("----------------------------------------------------------------------"); for(int i=0;i<Result.Count;i++) { SearchResultEntry sre=(SearchResultEntry)Result[i]; System.Console.WriteLine("[{0,2}]:{1}",sre.LineNumber,sre.LineStr); } System.Console.WriteLine("----------------------------------------------------------------------/n/n"); } } } |
-
SearchText类:该类的每个对象绑定一个文件,并对文件进行查询操作。
-
SearchResultEntry类:该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果,每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容。
- SearchDoor类:定义程序的主函数。
//SearchText.cs
using System;
using System.Collections; using SearchEngine.QueryClass; using SearchEngine.Expression;
namespace SearchEngine
{ /// <summary> /// 该类提供了搜索文件的类实现 /// 搜索文件的类 /// </summary> public class SearchText { private string file_name; private ArrayList expression_entries; public SearchText() { FileName=""; ExpressionEntries=new ArrayList(); }
public SearchText(string filename,ArrayList expressionEntries)
{ FileName=filename; ExpressionEntries=(ArrayList)expressionEntries.Clone(); }
public string FileName
{ set{file_name=value;} get{return file_name;} }
public ArrayList ExpressionEntries
{ set{expression_entries=(ArrayList)value.Clone();} get { ArrayList al=(ArrayList)expression_entries.Clone(); return al; } }
public ArrayList getSearchResult()
{ if(this.FileName=="") { System.Console.WriteLine("没有指定查询的文件!"); return null; } if(this.expression_entries.Count==0) { System.Console.WriteLine("查询字符串为空!"); return null; }
ArrayList expression=this.ExpressionEntries;
ArrayList Stack=new ArrayList();
for(int i=0;i<expression.Count;i++)
{ ExpressionEntry ee=(ExpressionEntry)expression[i]; if(ee.EntryType.Equals("string")) { Stack.Add(new NameQuery(ee.EntryValue,this.FileName)); } else if(ee.EntryType.Equals("And")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new AndQuery(q1,q2));
} else if(ee.EntryType.Equals("Or")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new OrQuery(q1,q2));
} else if(ee.EntryType.Equals("Not")) { if(Stack.Count<1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new NotQuery(q,this.FileName));
} else { System.Console.WriteLine("表达式出现异常!"); return null;
}
} if(Stack.Count!=1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
return ((Query)Stack[0]).SearchResults;
}
public static void PrintSearchResult(ArrayList Result) { System.Console.WriteLine("查询结果:共找到{0}条记录。",Result.Count); System.Console.WriteLine("----------------------------------------------------------------------"); for(int i=0;i<Result.Count;i++) { SearchResultEntry sre=(SearchResultEntry)Result[i]; System.Console.WriteLine("[{0,2}]:{1}",sre.LineNumber,sre.LineStr); } System.Console.WriteLine("----------------------------------------------------------------------/n/n"); } } } |
-
SearchText类:该类的每个对象绑定一个文件,并对文件进行查询操作。
-
SearchResultEntry类:该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果,每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容。
- SearchDoor类:定义程序的主函数。
//SearchText.cs
using System;
using System.Collections; using SearchEngine.QueryClass; using SearchEngine.Expression;
namespace SearchEngine
{ /// <summary> /// 该类提供了搜索文件的类实现 /// 搜索文件的类 /// </summary> public class SearchText { private string file_name; private ArrayList expression_entries; public SearchText() { FileName=""; ExpressionEntries=new ArrayList(); }
public SearchText(string filename,ArrayList expressionEntries)
{ FileName=filename; ExpressionEntries=(ArrayList)expressionEntries.Clone(); }
public string FileName
{ set{file_name=value;} get{return file_name;} }
public ArrayList ExpressionEntries
{ set{expression_entries=(ArrayList)value.Clone();} get { ArrayList al=(ArrayList)expression_entries.Clone(); return al; } }
public ArrayList getSearchResult()
{ if(this.FileName=="") { System.Console.WriteLine("没有指定查询的文件!"); return null; } if(this.expression_entries.Count==0) { System.Console.WriteLine("查询字符串为空!"); return null; }
ArrayList expression=this.ExpressionEntries;
ArrayList Stack=new ArrayList();
for(int i=0;i<expression.Count;i++)
{ ExpressionEntry ee=(ExpressionEntry)expression[i]; if(ee.EntryType.Equals("string")) { Stack.Add(new NameQuery(ee.EntryValue,this.FileName)); } else if(ee.EntryType.Equals("And")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new AndQuery(q1,q2));
} else if(ee.EntryType.Equals("Or")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new OrQuery(q1,q2));
} else if(ee.EntryType.Equals("Not")) { if(Stack.Count<1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new NotQuery(q,this.FileName));
} else { System.Console.WriteLine("表达式出现异常!"); return null;
}
} if(Stack.Count!=1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
return ((Query)Stack[0]).SearchResults;
}
public static void PrintSearchResult(ArrayList Result) { System.Console.WriteLine("查询结果:共找到{0}条记录。",Result.Count); System.Console.WriteLine("----------------------------------------------------------------------"); for(int i=0;i<Result.Count;i++) { SearchResultEntry sre=(SearchResultEntry)Result[i]; System.Console.WriteLine("[{0,2}]:{1}",sre.LineNumber,sre.LineStr); } System.Console.WriteLine("----------------------------------------------------------------------/n/n"); } } } |
-
SearchText类:该类的每个对象绑定一个文件,并对文件进行查询操作。
-
SearchResultEntry类:该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果,每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容。
- SearchDoor类:定义程序的主函数。
//SearchText.cs
using System;
using System.Collections; using SearchEngine.QueryClass; using SearchEngine.Expression;
namespace SearchEngine
{ /// <summary> /// 该类提供了搜索文件的类实现 /// 搜索文件的类 /// </summary> public class SearchText { private string file_name; private ArrayList expression_entries; public SearchText() { FileName=""; ExpressionEntries=new ArrayList(); }
public SearchText(string filename,ArrayList expressionEntries)
{ FileName=filename; ExpressionEntries=(ArrayList)expressionEntries.Clone(); }
public string FileName
{ set{file_name=value;} get{return file_name;} }
public ArrayList ExpressionEntries
{ set{expression_entries=(ArrayList)value.Clone();} get { ArrayList al=(ArrayList)expression_entries.Clone(); return al; } }
public ArrayList getSearchResult()
{ if(this.FileName=="") { System.Console.WriteLine("没有指定查询的文件!"); return null; } if(this.expression_entries.Count==0) { System.Console.WriteLine("查询字符串为空!"); return null; }
ArrayList expression=this.ExpressionEntries;
ArrayList Stack=new ArrayList();
for(int i=0;i<expression.Count;i++)
{ ExpressionEntry ee=(ExpressionEntry)expression[i]; if(ee.EntryType.Equals("string")) { Stack.Add(new NameQuery(ee.EntryValue,this.FileName)); } else if(ee.EntryType.Equals("And")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new AndQuery(q1,q2));
} else if(ee.EntryType.Equals("Or")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new OrQuery(q1,q2));
} else if(ee.EntryType.Equals("Not")) { if(Stack.Count<1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new NotQuery(q,this.FileName));
} else { System.Console.WriteLine("表达式出现异常!"); return null;
}
} if(Stack.Count!=1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
return ((Query)Stack[0]).SearchResults;
}
public static void PrintSearchResult(ArrayList Result) { System.Console.WriteLine("查询结果:共找到{0}条记录。",Result.Count); System.Console.WriteLine("----------------------------------------------------------------------"); for(int i=0;i<Result.Count;i++) { SearchResultEntry sre=(SearchResultEntry)Result[i]; System.Console.WriteLine("[{0,2}]:{1}",sre.LineNumber,sre.LineStr); } System.Console.WriteLine("----------------------------------------------------------------------/n/n"); } } } |
-
SearchText类:该类的每个对象绑定一个文件,并对文件进行查询操作。
-
SearchResultEntry类:该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果,每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容。
- SearchDoor类:定义程序的主函数。
//SearchText.cs
using System;
using System.Collections; using SearchEngine.QueryClass; using SearchEngine.Expression;
namespace SearchEngine
{ /// <summary> /// 该类提供了搜索文件的类实现 /// 搜索文件的类 /// </summary> public class SearchText { private string file_name; private ArrayList expression_entries; public SearchText() { FileName=""; ExpressionEntries=new ArrayList(); }
public SearchText(string filename,ArrayList expressionEntries)
{ FileName=filename; ExpressionEntries=(ArrayList)expressionEntries.Clone(); }
public string FileName
{ set{file_name=value;} get{return file_name;} }
public ArrayList ExpressionEntries
{ set{expression_entries=(ArrayList)value.Clone();} get { ArrayList al=(ArrayList)expression_entries.Clone(); return al; } }
public ArrayList getSearchResult()
{ if(this.FileName=="") { System.Console.WriteLine("没有指定查询的文件!"); return null; } if(this.expression_entries.Count==0) { System.Console.WriteLine("查询字符串为空!"); return null; }
ArrayList expression=this.ExpressionEntries;
ArrayList Stack=new ArrayList();
for(int i=0;i<expression.Count;i++)
{ ExpressionEntry ee=(ExpressionEntry)expression[i]; if(ee.EntryType.Equals("string")) { Stack.Add(new NameQuery(ee.EntryValue,this.FileName)); } else if(ee.EntryType.Equals("And")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new AndQuery(q1,q2));
} else if(ee.EntryType.Equals("Or")) { if(Stack.Count<2) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q1=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Query q2=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new OrQuery(q1,q2));
} else if(ee.EntryType.Equals("Not")) { if(Stack.Count<1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
Query q=(Query)Stack[Stack.Count-1];
Stack.RemoveAt(Stack.Count-1);
Stack.Add(new NotQuery(q,this.FileName));
} else { System.Console.WriteLine("表达式出现异常!"); return null;
}
} if(Stack.Count!=1) { System.Console.WriteLine("表达式语法出错,请检查!"); return null; }
return ((Query)Stack[0]).SearchResults;
}
public static void PrintSearchResult(ArrayList Result) { System.Console.WriteLine("查询结果:共找到{0}条记录。",Result.Count); System.Console.WriteLine("----------------------------------------------------------------------"); for(int i=0;i<Result.Count;i++) { SearchResultEntry sre=(SearchResultEntry)Result[i]; System.Console.WriteLine("[{0,2}]:{1}",sre.LineNumber,sre.LineStr); } System.Console.WriteLine("----------------------------------------------------------------------/n/n"); } } } |
//SearchResultEntry.cs
using System;
namespace SearchEngine
{ /// <summary> /// SearchResultEntry 的摘要说明。 /// 该类存储查询到的结果信息,每个SearchResultEntry对象存储一条查询结果 /// 每个SearchResultEntry包括两个部分,第一部分为结果的行号,第二部分为结果的内容 /// </summary> public class SearchResultEntry { private int line_number; private string line_str;
//默认构造函数
public SearchResultEntry() { LineNumber=-1; LineStr=null; }
//带参构造函数
public SearchResultEntry(int ln,string ls) { LineNumber=ln; LineStr=ls; }
//line_number属性
public int LineNumber { get{return line_number;} set{line_number=value;} }
//line_str属性
public string LineStr { get{return line_str;} set{line_str=value;} }
} } |
//SearchDoor.cs
using System;
using System.Collections; using SearchEngine.Expression; using SearchEngine.QueryClass; using System.IO;
namespace SearchEngine
{ //该类用做程序入口 public class SearchDoor { public static void Main() { System.Console.WriteLine(" ---------------------------------------------- "); System.Console.WriteLine(" 文件行搜索引擎 /n");
System.Console.WriteLine(" 1.支持与、或、非组合 2.支持括号嵌套 ");
System.Console.WriteLine(" ---------------------------------------------- "); System.Console.WriteLine(" 运行环境:Microsoft .Net FrameWork "); System.Console.WriteLine(" ---------------------------------------------- "); System.Console.Write("-请输入文件路径及文件名:"); String FileName=System.Console.ReadLine(); while(!File.Exists(FileName)) { System.Console.WriteLine("-你指定的文件不存在,请重新指定!/n"); System.Console.Write("-请输入文件路径及文件名:"); FileName=System.Console.ReadLine(); }
while(true)
{ System.Console.Write("/n-请输入查询串(支持括号):"); string QueryString=System.Console.ReadLine();
ExpressionProcess ep=new ExpressionProcess(QueryString);
ArrayList expression=ep.getContradictoryPolandExpressionEntries(); ExpressionProcess.PrintExpressionEntries(expression,1);
SearchText st=new SearchText(FileName,expression); ArrayList ResultSet=st.getSearchResult(); if(ResultSet!=null) SearchText.PrintSearchResult(ResultSet); } } } } |
2.面向对象设计方法中的继承可以使设计的类在概念与实现上有层次关系,多态的实质是方法的调用在执行期动态决定,如果多个类继承自一个父类,那么其父类的对象可以用它的子类的构造函数来构造,换句话说就是父类的指针可以指向并操作子类的对象,利用这一特性,我们在设计方法时,如果将参数的类型定义为父类的类型,那么将其子类的对象作为参数传入都是合法的,这样就不需要为每个子类都单独定义一个函数。