You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法实现方法重载: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逻辑(比如不管调用哪个,都用重量算),那就要用重写而不是重载:

  1. 父类方法标记为virtual:
public class PurchasedItem : GroceryItem
{
    public virtual decimal FindCost(GroceryItem gItem, int quantity)
    {
        return gItem.Price * quantity;
    }
}
  1. 子类用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:04:46