2017-09-04 124 views
-1

我是C#的新手,所以请原谅我的知识空白。在我的代码中,我有两种新鲜和常规的食物。 确定成本时新鲜料品使用与普通不同的FindCost方法。C# - 调用覆盖方法

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

我想我需要使用基本关键字莫名其妙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; 
     } 
    } 

} 

任何帮助赞赏

+0

您可能希望将其缩小为仅有相关代码。 – juharr

+0

尝试避免'ArrayList' - 使用'List '来代替。 – Enigmativity

+0

白色空间伤害我 – anomeric

回答

0

您当前的代码是否正确调用正确的FindCost()方法,但你在定义了类不好的方法,并与new关键字隐藏可以使它调用错误的方法。

您应该制作GroceryItemabstract并让您的两个类直接继承此类。然后GroceryItem可以有一个abstractFindCost()方法。另外,如果你隐藏了一个方法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; 
    } 
} 
+0

非常感谢你,我会通过每个职位。我发布了所有代码,因为我担心我会忽略相关的内容。 – bronxsystem

+0

我尝试使用你的代码,但它会得到大量的错误。我会通过一些教程,并学习更多关于继承= /谢谢你,虽然只是棘手的不知道所有的基本面。 [错误图像](https://image.ibb.co/hF7MKF/errors.jpg) – bronxsystem

+0

@bronxsystem - 你应该能够从我的代码工作,让你的代码工作。由于我所做的更改 - 你应该使用它 - 它使你现有的代码失败,但调试这些问题是你应该学习的技能。为了帮助我更新我的答案中的代码,包括如何使用它。让我知道如果你没有使用C#7作为'if(checkoutItem is PurchasedItem purchasedItem)''在早期版本的C#中不起作用。 – Enigmativity

0

当设置重量连类型PurchasedItem的参考: CheckoutItem4.Weight = 0.8; 您设置了在类PurchasedItem中声明的字段Weight,但方法FindCost使用FreshItem类中定义的字段Weight,该字段未初始化。所以,只需删除德行:public new double Weight {get;组; } // kg。您不需要重新定义此字段。

+0

当我使用你的方式时,它可以工作,但是这项任务要求我在新鲜的课程中使用Weight成员,Weight只能用在FreshItem课程中 我会在发布的建议线程感谢所有 – bronxsystem

+0

我从来没有见过这种使用之前'code' public override string Condition {get {return“Regular”; }} 我想了解更多关于它的具体术语吗?我将需要审查继承,抽象和重写等,但有没有一个代码行的名称? – bronxsystem