Mikee.Cara
Mikee.Cara

Reputation: 13

operator to access other classes's objects

I need help with this code. If you run the code you'll get in the last 7 lines (which is for...loop for Order object) Exercise.OrderItem.The problem is that I would like to access the OrderItem objects with for...loop but all I get are the last 7 lines representing OrderItem objects.How can I access them in for...loop so that I get the same as in foreach...loop? I think it has something to do with the indexer.Thank You.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;

    namespace Exercise
    {
        interface IPricing
        {
            //read/write property
            double Price
            {
                get;
                set;
            }
            double Discount
            {
                get;
                set;
            }
        }
        public class Order:IPricing
        {
            private string name;
            private double price;
            private static int OrderNo;
            //private ArrayList m_items = new ArrayList();
            private ArrayList m_items;


            //static constructor
            static Order()
            {
                OrderNo = 0;
            }

            //default constructor
            public Order()
            {
                name = null;
                price = 0;
                OrderNo++;
                m_items = new ArrayList();
            }
            //constructor with parameters
            public Order(string name, double price)
            {
                this.name = name;
                this.price = price;
                OrderNo++;
                this.m_items = new ArrayList();
            }
            //copy constructor
            public Order(Order order)
            {
                this.name = order.name;
                this.price = order.price;
                this.m_items = order.m_items;
            }

            public string Name
            {
                get { return name; }
                set { name = value; }
            }

            public IEnumerable Items
            {
                get { return m_items; }
                private set { }
            }

            public void AddItem(OrderItem orderItem)
            {
                orderItem.Order = name;
                m_items.Add(orderItem);
            }

            public static Order operator +(Order o1, Order o2)
            {
                Order o3 = new Order(o1.name+", "+o2.name,o1.price+o2.price);
                o3.m_items.AddRange(o1.m_items);
                o3.m_items.AddRange(o2.m_items);
                return o3;
            }

            //indexer 
            public object this[int index]
            {
                get 
                {
                    m_items[index] = this.m_items[index];
                    return m_items[index];
                }
                set { m_items[index] = value; }
            }

            public double ItemCount
            {
                get { return m_items.Count; }
                private set{}
            }


            public virtual void Print()
            {
                Console.WriteLine("*********************Order No. {0}***********************", OrderNo);
                Console.WriteLine("Details");
                Console.WriteLine("Name:              {0}", name);
                Console.WriteLine("Price:             {0}", price);
            }

            public double Price
            {
                get { return price - Discount; }
                set { price = value; }
            }

            public virtual double Discount
            {
                get { return 0; }
                set { ;}
            }

            public void PrintItems()
            {
                Console.WriteLine("Items in this order: ");
                Console.WriteLine();
                foreach(OrderItem itm in this.m_items)
                {
                    Console.WriteLine("Item name: {0,4};\tPart of order: {1}", itm.Name, itm.Order);
                }
            }


}

        public class OrderItem
        {
            private string m_name; //name of the item in order
            private string m_order; //name of the order whose parts are items with names m_name
            //default constructor
            public OrderItem()
            {
                m_order = null;
            }
            //parameter constructor
            public OrderItem(string name)
            {
                this.m_name = name;
                this.m_order = null;
            }
            //copy constructor
            public OrderItem(OrderItem orderItem)
            {
                this.m_name = orderItem.m_name;
                this.m_order = orderItem.m_order;
            }

            //Name read/write property
            public string Name
            {
                get { return m_name; }
                set { m_name = value; }
            }

            //Order read/write property
            public string Order
            {
                get { return m_order; }
                set { m_order = value; }
            }
        }

        public class MainProgram
        {
            static void Main(string[] args)
            {
                string order1 = "Desktop PC";
                Order desktopPC = new Order(order1,25000);
                desktopPC.AddItem(new OrderItem("pc mouse"));
                desktopPC.AddItem(new OrderItem("keyboard"));
                desktopPC.AddItem(new OrderItem("monitor"));
                desktopPC.AddItem(new OrderItem("pc"));

                desktopPC.Print();
                desktopPC.PrintItems();

                Console.WriteLine();


                string order2 = "Notebook";
                Order notebook = new Order(order2, 54000);
                notebook.AddItem(new OrderItem("mouse"));
                notebook.AddItem(new OrderItem("bag"));
                notebook.AddItem(new OrderItem("notebook"));


                notebook.Print();
                notebook.PrintItems();


                Console.WriteLine();
                Order total = desktopPC + notebook;
                total.Print();
                total.PrintItems();
                Console.WriteLine();

                Console.WriteLine("Getting the items via for loop");
                for (int k = 0; k < total.ItemCount; k++)
                {
                   Console.WriteLine(total[k]);
                }

                    Console.ReadKey();
            }
        }
    }

Upvotes: 1

Views: 56

Answers (1)

safetyOtter
safetyOtter

Reputation: 1460

        for (int k = 0; k < total.ItemCount; k++)
        {
            var x = total[k] as OrderItem;
            if (x == null) continue;
            Console.WriteLine(x.Name);
            Console.WriteLine(x.Order);
        }

Upvotes: 1

Related Questions