如何在GroceryItem子类的FindCost方法中调用price属性?传递方式咨询
问题分析与解决方案
嘿,先看你代码里的两个关键问题:
- 你写的
PurchasedItem是GroceryItem的嵌套类,不是子类(没加继承符号:),所以它没法直接访问外层类的实例属性; GroceryItem.price是实例属性,不是静态的,不能直接用类名调用,必须通过具体的对象实例来访问。
针对你的核心疑问——该从属性还是方法传递price?其实答案是直接通过属性访问更合理,但得先把类的结构调整对,下面给你两种可行的方案:
方案1:让PurchasedItem成为GroceryItem的子类
如果你本来就想让PurchasedItem作为GroceryItem的子类,那先修正继承关系,子类会自动继承父类的price属性,直接用就行:
class GroceryItem { public string name; public double price; public GroceryItem(string a, double b) { name = a; price = b; } } // 让PurchasedItem继承GroceryItem class PurchasedItem : GroceryItem { public int quantity; // 子类构造函数必须调用父类构造函数,初始化name和price public PurchasedItem(string itemName, double itemPrice, int buyQuantity) : base(itemName, itemPrice) { quantity = buyQuantity; } public double FindCost() { // 直接访问继承来的price属性,用this.price或者base.price都可以 return this.price * quantity * 1.10; } } class FreshItem { public double weight; }
这种情况下,price是子类实例自带的属性,不需要额外传递,直接用就好。
方案2:保留嵌套类结构,关联GroceryItem实例
如果你想维持嵌套类的设计,那得让PurchasedItem持有一个GroceryItem的对象引用,这样才能访问它的price属性:
class GroceryItem { public string name; public double price; public GroceryItem(string a, double b) { name = a; price = b; } class PurchasedItem { public int quantity; // 保存GroceryItem的实例引用 private readonly GroceryItem _parentItem; // 构造时传入对应的GroceryItem实例 public PurchasedItem(GroceryItem groceryItem, int buyQuantity) { _parentItem = groceryItem; quantity = buyQuantity; } public double FindCost() { // 通过实例引用访问price属性 return _parentItem.price * quantity * 1.10; } } class FreshItem { public double weight; } }
补充说明
至于你问的“从方法还是属性传递”——其实完全没必要写个方法来传递price,直接访问属性是最直接、符合C#设计习惯的方式。除非你有特殊需求(比如要对price做额外处理),才需要给GroceryItem加个GetPrice()方法,但那是多余的。
最后给你个调用示例(以方案1为例):
// 创建一个买了3个苹果的实例,单价2.5 var boughtApples = new PurchasedItem("Apple", 2.5, 3); // 计算含10%税费的总价 double total = boughtApples.FindCost(); Console.WriteLine(total); // 输出8.25
内容的提问来源于stack exchange,提问作者Rosco verheij
相关产品推荐
相关产品推荐

