c - 无法解决方法重载
问题描述
我试图用 FreshItem 子类中的新方法重载PurchasedItem中的FindCost方法。新的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);
}
}
}
解决方案
当基类具有带参数的构造函数时,您应该显式调用它。肯定是:
public FreshItem():base(/*pass paramter*/)
{
}
请参阅:派生类显式基构造函数调用
对于您的第二个问题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();
}
推荐阅读
- vue.js - 如何在 vueJS 中捕获后退按钮
- ios - 什么 UIKit 对象控制“查找”弹出窗口的外观?
- database - Sqlite 数据库不使用现有索引
- google-cloud-platform - Google Cloud 函数 Nodejs 执行上下文和全局变量
- php - Codeigniter 中的 Mysqli 异常
- python - 如何从包含最大 3 个值的 2d numpy 数组中获取列的索引
- php - Symfony4 内置安全性上的密码重置/更改密码
- typescript - Typescript3.1.3 + 泛型,类型分配错误
- sql-server - SQL 行聚合
- javascript - 切换翻转开关后如何使弹出屏幕出现?