运算符来访问其他类的对象

时间:2014-04-05 15:22:34

标签: c#

我需要有关此代码的帮助。如果您运行代码,您将获得最后7行(这是针对 Order 对象的循环)Exercise.OrderItem。问题是我想访问< em> OrderItem 对象有... for循环,但我得到的是代表 OrderItem 对象的最后7行。如何在...循环中访问它们以便我得到与foreach ...循环相同?我认为它与索引器有关。谢谢。

    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();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

        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);
        }