C#-调用覆盖方法

C#-调用覆盖方法,c#,C#,我是C#的新手,请原谅我的知识差距。在我的代码中,我有两种食物:新鲜食物和普通食物。 确定新项目成本时,使用与常规项目不同的FindCost方法 我在解决如何为新项目调用FindCost()方法时遇到问题 我想我需要使用base关键字s: namespace Groceries { class Program { static void Main(string[] args) { PurchasedItem Checko

我是C#的新手,请原谅我的知识差距。在我的代码中,我有两种食物:新鲜食物和普通食物。 确定新项目成本时,使用与常规项目不同的FindCost方法

我在解决如何为新项目调用FindCost()方法时遇到问题

我想我需要使用base关键字s:

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”;}之前使用过它我想了解更多关于它的信息,有没有一个专门的术语?我需要回顾继承、抽象和重写等,但是这行代码有名字吗?