2016-07-06 12 views
0

Ich muss verwenden und setzen Befehle um den Preis 10% zu senken, wenn es über 30 ist. Der Preis ändert sich nicht und offensichtlich gibt es etwas, das ich nicht ' Keine Notiz. Die Aufgabe erfordert die Verwendung der Eigenschaft. Get muss den Wert des Preiskommandos zurückgeben. Es gab einen Tipp, den Sie verwenden sollten, wenn Sie sich im Befehl set befinden.C# senken Sie den Preis mit Get/Set, wenn der Wert ist über x

using System; 
class Book 
{ 
public string Name; 
public string Writer; 
public string publisher; 
private float price; 
public string genre; 



public Book(string Name, string Writer, string publisher, float price, string genre) 
{ 
    this.Name = Name; 
    this.Writer = Writer; 
    this.publisher = publisher; 
    this.price = price; 
    this.genre = genre; 
}  

public float Price 
{ 
    get 
    { 
     return price; 
    } 
    set 
    { 
     if (value > 30) 
     { 
      price = value *0.90f;     
     } 
     else 
     { 
      price = value; 
     } 
    } 
} 
static void Main(string[] args) 
{ 
    Book b = new Book("First Book", "W. Writer", "publish company 1", 21.50f, "Crime"); 
    Book b2 = new Book("Second Book", "T. Typer", "publish company 2", 36.90f, "Fantasy"); 
    Console.WriteLine(b.price); 
    Console.WriteLine(b2.Price); 
}} 

Antwort

1

Das Problem liegt in Ihrem Konstruktor. Anstatt über die Immobilie auf den Preis zuzugreifen, greifen Sie direkt darauf zu. Ihre Klasse benötigt ein kleines Refactoring.

class Book 
{ 
    public string Name { get; set; } 
    public string Writer { get; set; } 
    public string Publisher { get; set; } 
    public string Genre { get; set; } 

    private float _price; 
    public float Price 
    { 
     get 
     { 
      return _price; 
     } 
     set 
     { 
      if (value > 30) 
      { 
       _price = value * 0.90f; 
      } 
      else 
      { 
       _price = value; 
      } 
     } 
    } 

    public Book(string name, string writer, string publisher, float price, string genre) 
    { 
     Name = name; 
     Writer = writer; 
     Publisher = publisher; 
     Price = price; 
     Genre = genre; 
    } 
} 

Es ist eine gute Übung, das Feld einer Klasse nicht direkt zu belichten. Dazu können Sie Eigenschaften verwenden, die das Konzept der Kapselung unterstützen. Was ist der Unterschied zwischen der folgenden Eigenschaft:

public string Name { get; set; } 

und die Eigenschaft genannt Price. Die erste ist eine automatisch implementierte Eigenschaft. Das heißt, wenn der Code kompiliert wird, wird ein Hintergrundfeld für den Namen erstellt und zur Laufzeit wird der Wert dieses Felds zurückgegeben, wenn Sie darauf zugreifen (, wobei book eine Instanz von Book ist). Es entspricht der folgenden:

private string _name; 
public string Name 
{ 
    get { return _name;} 
    set { _name = value; } 
} 

Darüber hinaus die Namenskonventionen halten wir oben im Auge verwendet werden, da dies zu # -Code Basen viele C üblich ist. Die Eigenschaften beginnen mit einem Großbuchstaben, während die privaten Felder mit einem kleinen Buchstaben beginnen (wobei immer camel case verwendet wird), dem manchmal ein Unterstrich vorangestellt ist, _.

1

Natürlich ist es nie gesetzt, weil Sie nie einen neuen Preis setzen und Ihr Konstruktor ist nur das Preisschild, nicht die Eigenschaft.

Wenn Sie b2.Price = 36.90f;

vor Ihrer Console.WriteLine hinzufügen wird es den richtigen Wert einstellen.

Wenn Sie 10 Prozent im Konstruktor entfernen möchten, dann ersetzen Sie die Zeile

this.price = price; 

mit

this.Price = price; 

Auch empfehle ich Ihnen, Ihren Code ein wenig Refactoring sollte. :)

0

In der Hauptfunktion instanziieren Sie das Book-Objekt mit Konstruktor und im Konstruktor legen Sie das Preisfeld, nicht die Eigenschaft fest. Der Code, den Sie zum Festlegen des Preisfeldes geschrieben haben, wird also nie ausgeführt. Sie können den Konstruktor so ändern, dass das Feld "Eigenschaft nicht" festgelegt wird (dh Price mit Großbuchstaben P).