2017-09-04 2 views
-1

Ich bin neu in C# so bitte entschuldigen Lücken in meinem Wissen. In meinem Code habe ich zwei Arten von Lebensmitteln frisch und regelmäßig. Beim Ermitteln der Kosten Fresh-Elemente verwenden eine andere FindCost-Methode als Regular.C# - Calling Override-Methode

Ich habe Probleme herauszufinden, wie Sie die FindCost() -Methode für Fresh Items aufrufen.

Ich glaube, ich muss irgendwie die Basis Schlüsselwort verwenden 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; 
     } 
    } 

} 

jede Hilfe dankbar

+0

Sie können dies auf den betreffenden Code reduzieren. – juharr

+0

Versuchen Sie, 'ArrayList' zu vermeiden - verwenden Sie stattdessen' List '. – Enigmativity

+0

Dieser weiße Raum tut mir weh – anomeric

Antwort

0

Ihre aktuellen Code ist die richtige FindCost() Methode richtig aufrufen, aber Sie haben in einem Ihrer Klassen definiert schlechter Weg, und mit dem Schlüsselwort new versteckt kann es die falsche Methode aufrufen.

Sie sollten GroceryItemabstract machen und beide Klassen direkt davon erben. Dann GroceryItem kann eine abstractFindCost() Methode haben. Wenn Sie eine Methode mit new ausblenden, dann tun Sie wahrscheinlich etwas falsch. Sie sollten feststellen, dass damit alle Unsicherheiten beim Aufruf von FindCost() beseitigt werden.

Auch sollten Sie decimal anstatt double für finanzielle Berechnungen verwenden, da double nicht immer genau die monetären Werte darstellt.

Hier sind die verbesserten Klassen:

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

Vielen Dank, ich werde jeden Beitrag durchgehen. Ich habe den ganzen Code gepostet, weil ich mir Sorgen machte, dass ich etwas Wichtiges weglassen würde. – bronxsystem

+0

Ich habe versucht, Ihren Code zu verwenden, aber es gibt eine Menge Fehler. Ich werde einige Tutorials durchgehen und mehr über Vererbung erfahren =/danke, obwohl es nur schwierig ist, ohne alle Grundlagen zu kennen. [Bild von Fehlern] (https://image.ibb.co/hF7MKF/errors.jpg) – bronxsystem

+0

@bronxsystem - Sie sollten in der Lage sein, von meinem Code zu arbeiten, damit Ihr Code funktioniert. Aufgrund der Änderungen, die ich vorgenommen habe - was Sie verwenden sollten - führte dies dazu, dass Ihr vorhandener Code fehlschlug, aber das Debuggen dieser Probleme ist eine Fähigkeit, die Sie lernen sollten. Um zu helfen, habe ich den Code in meiner Antwort aktualisiert, um einzuschließen, wie Sie es verwenden können. Lassen Sie mich wissen, wenn Sie C# 7 nicht verwenden, da das 'if (checkoutItem ist PurchasedItem gekauftesElement)' nicht mit früheren Versionen von C# funktioniert. – Enigmativity

0

Wenn Sie Gewicht mit der Referenz des Typs PurchasedItem gesetzt: CheckoutItem4.Weight = 0,8; Sie haben das Feld Gewicht in der Klasse PurchasedItem deklariert, aber die Methode FindCost verwendet das in der Klasse FreshItem definierte Feld Weight, das nicht initialisiert wird. Also, entfernen Sie einfach die Zeile: public new double Weight {get; einstellen; } // kg. Sie müssen dieses Feld nicht neu definieren.

+0

Es funktioniert, wenn ich Ihren Weg benutze, aber die Aufgabe fordert mich auf, das Weight - Mitglied in der neuen Klasse zu verwenden. Gewicht sollte nur in der FreshItem - Klasse sein. Ich werde das alles noch einmal mit dem in Thread danke alle – bronxsystem

+0

Ich habe noch nie zuvor diese verwendetgesehen'code' public override Zeichenfolge Bedingung {get {return "Regular"; }} Ich möchte mehr darüber erfahren Gibt es einen bestimmten Begriff dafür? Ich muss die Vererbung, Abstraktion und das Überschreiben usw. überprüfen, aber gibt es einen Namen für diese Codezeile? – bronxsystem