我试图用FindCost子类中的一个新方法重载PurchasedItem中的FreshItem方法。新的FreshItem FindCost方法使用权重而不是数量来确定成本。
我会犯错误:
不存在与所需的形式参数“gItem”相对应的参数 'Program.GroceryItem.PurchasedItem.FreshItem.FindCost()‘隐藏继承的成员'Program.GroceryItem.PurchasedItem.FindCost()'.如果有意隐藏,请使用新关键字。
如果项目是新的,我如何允许使用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);
}
}
}发布于 2018-04-25 03:57:29
你这样做:
FreshItem : PurchasedItem因此,您正在继承PurchasedItem.FindCost,但是在FreshItem中也有FindCost方法,因此您得到了这个错误,这是非常清楚的,并且抱怨您在上面所做的事情:
Program.GroceryItem.PurchasedItem.FreshItem.FindCost()‘隐藏继承的成员'Program.GroceryItem.PurchasedItem.FindCost()'.如果有意隐藏,请使用新关键字。
要修复此错误,可以将PurchasedItem.FindCost声明为虚拟的,这样您就可以重写它:
public virtual double FindCost()然后在FreshItem中重写它:
public override double FindCost()有关另一个错误,请参见@MazaherBazari的答复。
发布于 2018-04-25 03:31:24
当基类有带有参数的构造函数时,您应该将它称为explicity。它必须是:
public FreshItem():base(/*pass paramter*/)
{
}请参阅:Derived class explicit base constructor call
对于第二个问题,PurchasedItem和FreshItem必须继承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();
}发布于 2018-04-25 03:48:57
要修复第一个错误,请使用Mazaher Bazari答案
但是你的代码仍然不能像你想的那样工作
试着像这样修理
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;
}
}如果不需要将Virtual和Override添加到重写方法,则应将新实例作为FreshItem来使用FreshItem FindCost。
https://stackoverflow.com/questions/50013577
复制相似问题