C#-调用覆盖方法
我是C#的新手,请原谅我的知识差距。在我的代码中,我有两种食物:新鲜食物和普通食物。 确定新项目成本时,使用与常规项目不同的FindCost方法 我在解决如何为新项目调用FindCost()方法时遇到问题 我想我需要使用base关键字s:C#-调用覆盖方法,c#,C#,我是C#的新手,请原谅我的知识差距。在我的代码中,我有两种食物:新鲜食物和普通食物。 确定新项目成本时,使用与常规项目不同的FindCost方法 我在解决如何为新项目调用FindCost()方法时遇到问题 我想我需要使用base关键字s: namespace Groceries { class Program { static void Main(string[] args) { PurchasedItem Checko
namespace Groceries
{
class Program
{
static void Main(string[] args)
{
PurchasedItem CheckoutItem4 = new FreshItem();
CheckoutItem4.Name = "Rump Steak";
CheckoutItem4.Condition = "Fresh";
CheckoutItem4.Price = 11.99;
CheckoutItem4.Weight = .8;
ArrayList invoiceArray = new ArrayList();
invoiceArray.Add(CheckoutItem1);
foreach (PurchasedItem checkoutItem in invoiceArray)
{
Console.WriteLine($"Quantity: {checkoutItem.Quantity} Weight: {checkoutItem.Weight}kg ");
}
Console.ReadLine();
}
}
public class GroceryItem
{
public string Name { get; set; }
public string Condition { get; set; }
public double Price { get; set; }
public GroceryItem()
{
}
public GroceryItem(string name, double price)
{
this.Name = name;
this.Price = price;
}
public static void Invoice()
{
Console.WriteLine();
}
}
public class PurchasedItem : GroceryItem
{
public int Quantity { get; set; }
public double Weight { get; internal set; }
public virtual double FindCost()
{
double cost = Quantity * Price * 1.1; //1.1 is GST
return cost;
}
}
public class FreshItem : PurchasedItem
{
public new double Weight { get; set; } //kg
public override double FindCost()
{
double cost = Weight * Price;
return cost;
}
}
}
您当前的代码正确地调用了正确的
FindCost()
方法,但是您定义类的方式很差,使用new
关键字隐藏可能会使它调用错误的方法
您应该将GroceryItem
抽象化
,并让您的两个类直接从中继承。然后GroceryItem
可以有一个abstract
FindCost()
方法。此外,如果您使用new
隐藏方法,则可能是做错了什么。您应该发现,这消除了调用FindCost()
时的所有不确定性
此外,您应该使用decimal
而不是double
进行财务计算,因为double
并不总是准确地表示货币价值
以下是改进的类:
void Main()
{
List<GroceryItem> invoiceArray = new List<GroceryItem>()
{
new FreshItem() { Name = "Rump Steak", Price = 11.99m, Weight = 0.8 },
new PurchasedItem() { Name = "Cream", Price = 2.2m, Quantity = 1, Weight = 0.6 },
};
foreach (GroceryItem checkoutItem in invoiceArray)
{
if (checkoutItem is PurchasedItem purchasedItem)
{
Console.WriteLine($"Condition: {checkoutItem.Condition}; Quantity: {purchasedItem.Quantity}; Weight: {checkoutItem.Weight}kg");
}
else
{
Console.WriteLine($"Condition: {checkoutItem.Condition}; Weight: {checkoutItem.Weight}kg");
}
}
Console.ReadLine();
}
public abstract class GroceryItem
{
public string Name { get; set; }
public abstract string Condition { get; }
public double Weight { get; set; }
public decimal Price { get; set; }
public GroceryItem() { }
public GroceryItem(string name, decimal price)
{
this.Name = name;
this.Price = price;
}
public abstract decimal FindCost();
}
public class PurchasedItem : GroceryItem
{
public int Quantity { get; set; }
public override string Condition { get { return "Regular"; } }
public override decimal FindCost()
{
decimal cost = Quantity * Price * 1.1m; //1.1m is GST
return cost;
}
}
public class FreshItem : GroceryItem
{
public override string Condition { get { return "Fresh"; } }
public override decimal FindCost()
{
decimal cost = (decimal)Weight * Price;
return cost;
}
}
void Main()
{
List invoiceArray=新列表()
{
new FreshItem(){Name=“臀部牛排”,价格=11.99m,重量=0.8},
新的PurchasedItem(){Name=“Cream”,价格=2.2m,数量=1,重量=0.6},
};
foreach(发票数组中的杂货店项目签出项)
{
if(签出项为PurchasedItem PurchasedItem)
{
Console.WriteLine($“条件:{checkoutItem.Condition};数量:{purchasedItem.Quantity};重量:{checkoutItem.Weight}kg”);
}
其他的
{
WriteLine($“条件:{checkoutItem.Condition};重量:{checkoutItem.Weight}kg”);
}
}
Console.ReadLine();
}
公共抽象类GroceryItem
{
公共字符串名称{get;set;}
公共抽象字符串条件{get;}
公共双权重{get;set;}
公共十进制价格{get;set;}
公共杂货店项目(){}
公共杂货项目(字符串名称,十进制价格)
{
this.Name=Name;
这个。价格=价格;
}
公共抽象十进制FindCost();
}
公共类PurchasedItem:GroceryItem
{
公共整数数量{get;set;}
公共重写字符串条件{get{return“Regular”;}
公共重写十进制FindCost()
{
十进制成本=数量*价格*1.1m;//1.1m为商品及服务税
退货成本;
}
}
公共类物品:杂货店物品
{
公共重写字符串条件{get{return“Fresh”;}
公共重写十进制FindCost()
{
十进制成本=(十进制)重量*价格;
退货成本;
}
}
使用PurchasedItem类型的参考设置重量时:
签出项4.权重=.8;
您设置了在类PurchasedItem中声明的字段权重,但FindCost方法使用了在类FreshItem中定义的未初始化字段权重。所以,只需删除de line:public新的双重{get;set;}//kg。您不需要重新定义此字段。您可能希望将其简化为所讨论的代码。请尽量避免使用
ArrayList
-改用List
。如果您的代码工作正常,则此空白会对我造成伤害。它正在调用正确的FindCost
方法。为什么您认为它不是?base用于引用方法的原始定义,而不是重写的定义,为什么您需要它?除非有更多的计算,然后显示在上面,我不知道你在问什么,或哪里是问题。要在fresh item上调用FindCost,只需创建fresh item的一个实例并调用该实例上的方法即可。非常感谢大家,我将浏览每一篇文章。我发布了所有的代码,因为我担心我会遗漏一些相关的东西。我尝试使用你的代码,但它得到了大量的错误。我将学习一些教程,了解更多关于继承的知识=/谢谢你,虽然在不了解所有基础知识的情况下有些棘手。[image of errors]()@bronxsystem-您应该能够使用我的代码来让代码正常工作。由于我所做的更改(您应该使用这些更改),它使您现有的代码失败,但调试这些问题是您应该学习的技能。为了帮助您,我更新了答案中的代码,包括如何使用它。如果您没有使用C#7,请告诉我,因为如果(checkoutItem是PurchasedItem PurchasedItem)在早期版本的C#上不起作用。谢谢,我会再试一次(:我正在使用C#7,我会再次尝试,谢谢你,它工作得很好。问题是我不完全理解它。我感谢你的帮助,我被完全卡住了。现在我知道如何让它工作了,我只需要理解它。我已经试着学习C#两个月了,一直在碰壁。谢谢你,谢谢我用你的方式工作呃作业要求我在fresh类中使用Weight成员。Weight只应在FreshItem类中使用。我将使用线程中发布的建议再次检查它。谢谢allI,我从未见过在'code'公共重写字符串条件{get{return“Regular”;}之前使用过它我想了解更多关于它的信息,有没有一个专门的术语?我需要回顾继承、抽象和重写等,但是这行代码有名字吗?