/* updated with xml parsing functions */ using System; using System.IO; using System.Text; using System.Xml; public interface student { object accept(studentvisitor v); } public interface studentvisitor { object visit(grad s); object visit(undergrad s); object visit(nilstudent s); } public interface stufriend { } public class studentbase : student { public readonly string name; protected int tuition; protected double gpa; public int gettuition(stufriend sf) { return tuition; } public void settuition(stufriend sf,int g) { tuition = g; } public double getgpa(stufriend sf) { return gpa; } public studentbase(string n, double g) { name = n; gpa = g; } public virtual object accept(studentvisitor s) {return null;} public student next; } public class grad : studentbase, student { public readonly string thesis; public grad(string n, double g, string t) : base(n,g) { thesis = t; tuition = 2000; } public override object accept(studentvisitor s) { return s.visit(this); } } public class undergrad : studentbase, student { public readonly string major; public undergrad(string n, double g, string t) : base(n,g) { major = t; tuition = 1500; } public override object accept(studentvisitor s) { return s.visit(this); } } public class nilstudent : student { public object accept(studentvisitor s) { return s.visit(this); } } ////// visitor classes public class printinfo : studentvisitor, stufriend { public object visit(grad g) { Console.WriteLine(g.name + " is a grad student, "); Console.WriteLine("tuition is " + g.gettuition(this)); return g.next.accept(this); } public object visit(undergrad u) { Console.WriteLine(u.name + " is an undergrad, "); Console.WriteLine("tuition is " + u.gettuition(this)); return u.next.accept(this); } public object visit(nilstudent n) { return null; } } // printinfo public class tuitionadjuster : studentvisitor, stufriend { private int uamt, gamt; private int sum = 0; public tuitionadjuster(int u, int g) { uamt = u; gamt = g; } public object visit(undergrad u) { u.settuition(this, uamt+u.gettuition(this)); sum += u.gettuition(this); return u.next.accept(this); } public object visit(grad g) { g.settuition(this, gamt+g.gettuition(this)); sum += g.gettuition(this); return g.next.accept(this); } public object visit(nilstudent n) { return sum; } } public class students { public static void Main() { grad g1 = new grad("adam",2.02,"networks"); undergrad u1 = new undergrad("ted",3.0,"cs"); undergrad u2 = new undergrad("mary",4.0,"math"); u1.next = g1; g1.next = u2; u2.next = new nilstudent(); student l = u1; printinfo printer = new printinfo(); l.accept(printer); int sum = (int)l.accept(new tuitionadjuster(200,300)); l.accept(new printinfo()); Console.WriteLine("total tuition: "+sum); student l2 = parse("stu.xml"); Console.WriteLine("from xml file: ----- "); l2.accept(printer); } // main ////////////// xml parser public static student cons(studentbase a, student b) { a.next = b; return a; } public static student parse(string filename) { student sl = new nilstudent(); // list to be built XmlTextReader reader = new XmlTextReader(filename); try { // look for the students root node: while (reader.NodeType != XmlNodeType.Element || reader.Name != "students") { reader.Read(); } reader.Read(); while (!(reader.NodeType==XmlNodeType.EndElement && reader.Name == "students")) { if (reader.Name=="undergrad") sl = parseu(sl,reader); else if (reader.Name=="grad") sl = parseg(sl,reader); reader.Read(); } // while } catch (Exception ee) {Console.WriteLine(ee);} return sl; } // parse public static student parseu(student sl,XmlTextReader reader) { undergrad newu; string name="", major=""; double gpa; reader.MoveToAttribute(reader.AttributeCount-1); if (reader.Name == "name") name = reader.Value; reader.MoveToContent(); while (reader.Name !="gpa") reader.Read(); gpa = double.Parse(reader.ReadElementString()); while (reader.Name !="major") reader.Read(); major = reader.ReadElementString(); newu = new undergrad(name,gpa,major); newu.next = sl; while (reader.NodeType!=XmlNodeType.EndElement || reader.Name!="undergrad") reader.Read(); return newu; } public static student parseg(student sl,XmlTextReader reader) { grad newg; string name="", thesis=""; double gpa; reader.MoveToAttribute(0); if (reader.Name == "name") name = reader.Value; reader.MoveToContent(); while (reader.Name !="gpa") reader.Read(); reader.MoveToContent(); gpa = double.Parse(reader.ReadElementString()); while (reader.Name !="thesis") reader.Read(); thesis = reader.ReadElementString(); newg = new grad(name,gpa,thesis); newg.next = sl; while (reader.NodeType!=XmlNodeType.EndElement || reader.Name!="grad") reader.Read(); return newg; } }// public class students