2016-07-06 7 views
0

30以上であればgetとsetコマンドを使用して価格を10%下げる必要があります。価格は変わらず、通知。タスクでは、プロパティを使用する必要があります。 Getは価格コマンドの値を返す必要があります。 setコマンドで使用するとヒントがありました。C#値がx以上であればget/setで価格を下げる

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); 
}} 

答えて

1

問題は、あなたのコンストラクタです。プロパティを介して価格にアクセスするのではなく、直接アクセスします。クラスには小さなリファクタリングが必要です。

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; 
    } 
} 

クラスのフィールドを直接公開しないことをお勧めします。プロパティを使用することで、カプセル化の概念を促進することができます。次のプロパティの違いは何ですか:

public string Name { get; set; } 

とプロパティーPriceとなります。最初のものは自動実装されたプロパティです。つまり、コードがコンパイルされると、Nameのバッキングフィールドが作成され、実行時にこのフィールドの値が返されます(book.NamebookBookのインスタンスです)。これは、次と同等です:

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

、これは多くのC#のコードベースに共通しているので、心の中で私たちは上記で使用される命名規則を維持します。プロパティは大文字で始まり、プライベートフィールドは小文字(常にラクダの場合を使用)で始まり、場合によってはアンダースコアの先頭に_が付いています。

1

もちろん、新しい価格を設定することは決してないので、コンストラクタにはプロパティではなく値札しか設定されていないため、決して設定されません。

あなたConsole.WriteLineを前にb2.Price = 36.90f;

を追加する場合は、正しい値を設定します。あなたは、その後も

this.Price = price; 

でライン

this.price = price; 

を置き換える、コンストラクタで10パーセントを削除したい場合は

私はあなたのコードを少しリファクタリングする必要があり示唆しています。 :)

0

メイン関数では、コンストラクタでBookオブジェクトをインスタンス化しています。コンストラクタでは、プロパティではなく価格フィールドを設定します。だから、価格フィールドを設定するために書いたコードは決して実行されません。プロパティでないフィールドを設定するコンストラクタを変更することができます(つまり、Priceは大文字P)

this.Price = price; 
関連する問題