首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法计算方法过载

无法计算方法过载
EN

Stack Overflow用户
提问于 2018-04-25 03:23:35
回答 3查看 56关注 0票数 0

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

我会犯错误:

不存在与所需的形式参数“gItem”相对应的参数 'Program.GroceryItem.PurchasedItem.FreshItem.FindCost()‘隐藏继承的成员'Program.GroceryItem.PurchasedItem.FindCost()'.如果有意隐藏,请使用新关键字。

如果项目是新的,我如何允许使用FreshItem FindCost方法?

代码语言:javascript
复制
    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);
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-25 03:57:29

你这样做:

代码语言:javascript
复制
FreshItem : PurchasedItem

因此,您正在继承PurchasedItem.FindCost,但是在FreshItem中也有FindCost方法,因此您得到了这个错误,这是非常清楚的,并且抱怨您在上面所做的事情:

Program.GroceryItem.PurchasedItem.FreshItem.FindCost()‘隐藏继承的成员'Program.GroceryItem.PurchasedItem.FindCost()'.如果有意隐藏,请使用新关键字。

要修复此错误,可以将PurchasedItem.FindCost声明为虚拟的,这样您就可以重写它:

代码语言:javascript
复制
public virtual double FindCost()

然后在FreshItem中重写它:

代码语言:javascript
复制
public override double FindCost()

有关另一个错误,请参见@MazaherBazari的答复。

票数 1
EN

Stack Overflow用户

发布于 2018-04-25 03:31:24

当基类有带有参数的构造函数时,您应该将它称为explicity。它必须是:

代码语言:javascript
复制
public FreshItem():base(/*pass paramter*/)
{
}

请参阅:Derived class explicit base constructor call

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

代码语言:javascript
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2018-04-25 03:48:57

要修复第一个错误,请使用Mazaher Bazari答案

但是你的代码仍然不能像你想的那样工作

试着像这样修理

代码语言:javascript
复制
class Program
{
    public static void Main(string[] args)
    {
        var item1 = new GroceryItem("Lettuce", 2.05);
        item1.pItem = new FreshItem(item1);
        item1.pItem.Quantity = 12;
        double cost1 = item1.pItem.FindCost();


        Console.WriteLine(item1.Name + " " + item1.Price);
        Console.WriteLine(cost1);
        Console.ReadLine();
    }
}
public class PurchasedItem
{
    public int Quantity;
    protected GroceryItem item;
    public PurchasedItem(GroceryItem gItem)
    {
        item = new GroceryItem(gItem.Name, gItem.Price);
    }

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


}
public class FreshItem : PurchasedItem
{
    public double weight;

    public FreshItem(GroceryItem gItem) : base(gItem)
    {
    }

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

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

如果不需要将VirtualOverride添加到重写方法,则应将新实例作为FreshItem来使用FreshItem FindCost。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50013577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档