Transport class:

abstract class Transport //: IComparable<Transport> { protected string stamp;//марка protected int num;//номер protected int speed;//скорость public float carry;//грузоподъёмность public abstract void Show(); public abstract void Carrying(); /* public int CompareTo(Transport obj) { if (this.carry > obj.carry) return 1; if (this.carry < obj.carry) return -1; else return 0; }*/ } 

Car class:

 class Passenger_car : Transport { public Passenger_car(string stamp,int num,int speed,float carry) { this.stamp = stamp; this.num = num; this.speed = speed; this.carry = carry; } public override void Show() { Console.WriteLine("Марка-{0}\tНомер-{1}\tСкорость{2}\tГрузоподъёмность{3}", stamp, num, speed, carry); } public override void Carrying() { Console.WriteLine("Грузоподъёмность = {0}",carry); } } 

Motorcycle class:

 class Motorcycle : Passenger_car { public bool lulka; public Motorcycle(string stamp, int num, int speed, float carry,bool lulka):base(stamp,num,speed,carry) { this.lulka = lulka; if (this.lulka == false) { base.carry = 0; } } public override void Show() { Console.WriteLine("Марка-{0}\tНомер-{1}\tСкорость{2}\tГрузоподъёмность{3}\tЕсть люлька?->{4}", stamp, num, speed, carry, lulka); } public override void Carrying() { Console.WriteLine("Грузоподъёмность = {0}", carry); } } 

Truck class:

 class Truck : Passenger_car { protected bool trailer; public Truck(string stamp, int num, int speed, float carry,bool trailer):base(stamp, num, speed, carry) { this.trailer = trailer; if (this.trailer == true) { base.carry = carry * 2; } } public override void Show() { Console.WriteLine("Марка-{0}\tНомер-{1}\tСкорость{2}\tГрузоподъёмность{3}\tЕсть прицеп?->{4}", stamp, num, speed, carry, trailer); } public override void Carrying() { Console.WriteLine("Грузоподъёмность = {0}", carry); } } 

Main class:

  class Program { static void Main() { List <Transport> n= new List<Transport>(); n.Add ( new Passenger_car("BMW",777,500,200)); n.Add(new Motorcycle("KAWASAKI", 666, 350, 100,false)); n.Add (new Truck("KAMAZ",555,60,1000,true)); //n.Sort(); foreach (Transport item in n) { item.Show(); item.Carrying(); Console.WriteLine(); } } } 
  • one
    and where in the given code reading from the console? - Grundy
  • What to read from the file? Data for classes being created? - Bulson
  • Yes, for created classes - SecDet
  • @Grundy yes, well, simply did not know how to say :) The input data are statistically or nonsense? :) - SecDet
  • 2
    You can ask why you use methods in classes that displays information on the console ( Show , Carrying )? Instead of the Show method, it is better to override the standard ToString , the second method is also better to rewrite so that it returns a string. So your classes will be more flexible and you can use them in other types of projects. - user227049

1 answer 1

You make such a generic:

  public class XmlOperator<T> where T : Transport { private readonly string _filename; public XmlOperator(string filename) { _filename = filename; } public void SaveToXml(T[] collection) { XmlSerializer serializer = new XmlSerializer(typeof(T[])); using (FileStream fs = File.OpenWrite(_filename)) { serializer.Serialize(fs, collection); } } public T[] GetFromXml() { if (File.Exists(_filename)) { try { using (var reader = new StreamReader(_filename)) { var x = new XmlSerializer(typeof(T[])); result = (T[])x.Deserialize(reader); } } catch (Exception ex) { throw new Exception("Ошибка загрузки " + _filename + " : " + ex.Message); } } return result; } } 

If you need to use XML, then the serializable fields must be made public or wrapped in public properties. Binary as I remember and private eats. We also need public default constructors for serialized classes.

The Main method will be something like this:

 static void Main() { var cars = new List<Passenger_car> { new Passenger_car("BMW", 777, 500, 200), new Passenger_car("jiguli", 777777, 5, 2) }; PrintItems(cars); var saver_loader = new XmlOperator<Passenger_car> (@"cars.xml"); saver_loader.SaveToXml(cars.ToArray()); var loadedCarlist = saver_loader.GetFromXml(); PrintItems(loadedCarlist); Console.ReadLine(); } private static void PrintItems(IEnumerable<Transport> items) { foreach (var transport in items) { transport.Show(); transport.Carrying(); Console.WriteLine(); } } 
  • Why does he need XML? Not worth the task of serializing objects in XML. - Tibomso
  • Why not. Write your answer. - risty