无法实现方法重载:FreshItem子类重载FindCost方法报错求助
嘿,我来帮你理清楚这两个问题,搞定方法重载的事儿!
先搞懂两个错误的根源
1. "没有与必需的形参‘gItem’对应的实参"
这个错误很直白:你调用FindCost的时候,没有给方法传它需要的gItem参数,或者你的子类FindCost方法定义和调用时的参数不匹配。比如父类的FindCost可能需要gItem和数量,而你子类的方法要么没定义这个参数,要么调用时漏传了。
2. "隐藏了继承的成员"
这个提示说明你子类的FindCost方法和父类的方法名字相同,但参数列表不一样,但你没明确告诉编译器这是有意的重载(或者隐藏)。编译器默认认为你可能写错了,所以提醒你:如果是故意要做同名但参数不同的方法,要么用new关键字标记隐藏,要么调整参数让它成为真正的重载。
正确实现重载的步骤
重载的核心是:方法名相同,但参数列表(个数、类型、顺序)必须不一样。结合你的需求——用重量算成本,我们可以这么做:
第一步:明确父类的FindCost签名
假设你的父类PurchasedItem的方法是这样的(用数量计算):
public class PurchasedItem : GroceryItem { // 父类方法:用数量计算成本,需要商品信息和数量 public decimal FindCost(GroceryItem gItem, int quantity) { return gItem.Price * quantity; } }
第二步:在子类FreshItem中定义重载方法
子类的FindCost用重量计算,所以参数列表要和父类不一样——把第二个参数换成重量(比如double类型的公斤数):
public class FreshItem : PurchasedItem { // 重载父类的FindCost:参数是商品信息+重量,逻辑用重量计算 public decimal FindCost(GroceryItem gItem, double weightInKg) { // 把重量转成decimal和单价相乘 return gItem.Price * (decimal)weightInKg; } }
这样两个方法名字相同,但参数列表(一个是int数量,一个是double重量)不同,编译器会识别为合法的重载,不会再提示隐藏的问题。
第三步:正确调用重载方法
调用的时候根据需求传对应参数就行:
// 用父类的数量计算 var purchasedItem = new PurchasedItem(); decimal costByQuantity = purchasedItem.FindCost(myGroceryItem, 5); // 用子类的重量计算 var freshItem = new FreshItem(); decimal costByWeight = freshItem.FindCost(myGroceryItem, 2.5); // 2.5公斤
如果是想"重写"而非"重载"?
如果你其实是想让FreshItem替换父类的FindCost逻辑(比如不管调用哪个,都用重量算),那就要用重写而不是重载:
- 父类方法标记为
virtual:
public class PurchasedItem : GroceryItem { public virtual decimal FindCost(GroceryItem gItem, int quantity) { return gItem.Price * quantity; } }
- 子类用
override重写,不过这里参数要和父类一致,你可以调整逻辑或者再加个重载方便传小数重量:
public class FreshItem : PurchasedItem { // 重写父类方法,把数量当成重量(比如公斤数)计算 public override decimal FindCost(GroceryItem gItem, int quantity) { return gItem.Price * (decimal)quantity; } // 再加个重载方便传小数重量 public decimal FindCost(GroceryItem gItem, double weightInKg) { return gItem.Price * (decimal)weightInKg; } }
解决你的第一个错误
检查你调用FindCost的代码:
- 如果是调用子类的重载方法,要确保传了
gItem和weight两个参数; - 如果是调用父类的方法,要传
gItem和quantity。
比如如果你写了freshItem.FindCost()(空参数),那肯定会报错,因为没有任何一个FindCost方法是不需要参数的。
内容的提问来源于stack exchange,提问作者Rosco verheij
相关产品推荐
相关产品推荐

