首页 > 解决方案 > 无法解决方法重载

问题描述

我试图用 FreshItem 子类中的新方法重载PurchasedItemFindCost方法。新的FreshItem FindCost方法使用重量而不是数量来确定成本。

我收到错误:

没有给出与所需形式参数“gItem”相对应的参数

“Program.GroceryItem.PurchasedItem.FreshItem.FindCost()”隐藏了继承的成员“Program.GroceryItem.PurchasedItem.FindCost()”。如果打算隐藏,请使用 new 关键字。

如果商品是新鲜的,我将如何允许使用FreshItem FindCost方法?

    class Program
    {
        public class GroceryItem
        {
        public string Name;
        public double Price;

        public PurchasedItem pItem
        {
            get;
            set;
        }

        public GroceryItem()
        {
        }

        public GroceryItem(string name, double price)
        {
            this.Name = name;
            this.Price = price;
        }
        public class PurchasedItem
        {
            public int Quantity;
            GroceryItem item;
            public PurchasedItem(GroceryItem gItem)
            {
                item = new GroceryItem(gItem.Name, gItem.Price);
            }

            public double FindCost()
            {
                return item.Price * this.Quantity * 1.10;
            }

            public class FreshItem : PurchasedItem
            {
                public FreshItem() 
                {
                }
                public double weight;

                public double FindCost()
                {
                    return this.item.Price * this.weight;
                }

            }
        }
        public static void Main(string[] args)
        {
            var item1 = new GroceryItem("Lettuce", 2.05);
            item1.pItem = new GroceryItem.PurchasedItem(item1);
            item1.pItem.Quantity = 12;
            double cost1 = item1.pItem.FindCost();


            Console.WriteLine(item1.Name + " " + item1.Price);
            Console.WriteLine(cost1);
        }
    }
}

标签: c

解决方案


当基类具有带参数的构造函数时,您应该显式调用它。肯定是:

public FreshItem():base(/*pass paramter*/)
{
}

请参阅:派生类显式基构造函数调用

对于您的第二个问题PurchasedItemFreshItem必须继承 GroceryItem并实现FindMethod

public abstract class GroceryItem
    {
    public string Name {set;get;}
    public double Price {set;get;}

    public GroceryItem(string name, double price){
        this.Name = name;
        this.Price = price;
    }

    public abstract double FindCost();
}
public class PurchasedItem: GroceryItem
{
    public int Quantity {set;get;}
    public PurchasedItem(string name, double price, int quntity):base(name, price)
    {
      this.Quantity = quntity;
    }

    public override double FindCost()
    {
        return this.Price * this.Quantity * 1.10;
    }


}
public class FreshItem : GroceryItem
{
    public double Weight {set;get;}

    public FreshItem(string name, double price, int weight) : base(name, price)
    {
        this.Weight= weight;
    }
    public override double FindCost()
    {
        return this.Price * this.Weight;
    }
}


public static void Main(string[] args)
{
    var item1 = new PurchasedItem("Lettuce", 2.05,12);
    double cost1 = item1.FindCost();
}

推荐阅读