2012-03-02 8 views
2

私はアクセサーのメソッドと列挙について学んでいます。名前空間 'Vehicles'の下にパブリッククラス 'Car'を作成し、_manufacturer、_model、_year、_colorなどのプライベートプロパティを設定しました。私はプロパティにアクセスするためのメソッドと、それらを設定/更新するメソッドを記述したいと思います。プライベートオブジェクトのプロパティのアクセサメソッドの作成 - 列挙?

using System; 

namespace Vehicles 
{ 
    public class Car 
    { 
     private string _manufacturer; 
     private string _model; 
     private string _year; 
     private string _color; 

     public void honkHorn() 
     { 
      // Add argument for a file name? 
      // Code here to play a WAV file? 
      MessageBox.Show("Honk!"); 
     } 

     public string getCarInfo(string whichProperty) 
     { 
      switch (whichProperty) 
      { 
       case ("manufacturer"): 
        return _manufacturer; 
       case ("model"): 
        return _model; 
       case ("year"): 
        return _year; 
       case ("color"): 
        return _color; 
       default: 
        return null; 
      } 
     } 

     public void setCarInfo(string whichProperty, string newValue) 
     { 
      switch (whichProperty) 
      { 
       case ("manufacturer"): 
        _manufacturer = newValue; 
        break; 
       case ("model"): 
        _model = newValue; 
        break; 
       case ("year"): 
        _year = newValue; 
        break; 
       case ("color"): 
        _color = newValue; 
        break; 
      } 
     } 
    } 
} 

そして、これは私のフォームです::これは私のクラスである

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Vehicles; 

namespace CS_Enumeration 
{ 
    public partial class Form1 : Form 
    { 
     public Car myCar = new Car(); 

     public Form1() 
     { 
      InitializeComponent(); 

      myCar.setCarInfo("manufacturer", "Ford"); 
      labelManfValue.Text = myCar.getCarInfo("manufacturer"); 

      myCar.setCarInfo("model", "Ranger"); 
      labelModelValue.Text = myCar.getCarInfo("model"); 

      myCar.setCarInfo("year", "2012"); 
      labelYearValue.Text = myCar.getCarInfo("year"); 

      myCar.setCarInfo("color", "Blue"); 
      labelColorValue.Text = myCar.getCarInfo("color"); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      myCar.honkHorn(); 
     } 
    } 
} 

は、これは本当に設定/取得することができ、単一のメソッドを作成するための最良の方法ですか?最初にオブジェクトプロパティの名前と一致する文字列値をキャストしようとしましたが、実際のプロパティは返されましたが、(文字列をオブジェクトプロパティにキャストする方法が分からない限り)動作しません。

返信いただきありがとうございます。これは私が読んでいる本のすべての運動です。それは、すべてが公表されるべきではないと言われていますが、すべてがプライベートであるべきではないということも述べています。どうすれば公的/私的でないべきかを知ることができますか?この本のようなサウンドは、良いコーディングデザインが間違った方向に私を導いています。誰でも、Visual C#のコーディングデザインの優れた習得方法を学ぶための書籍の提案はありますか?

+2

なぜこれをやりますか?今これは恐ろしいデザインです - プロパティを公開するだけです。その上に、あなたの現在のアプローチですべての型の安全性が失われ、すべてのタイプミスがランタイム例外を引き起こします – BrokenGlass

+0

オリジナルの投稿への編集を参照してください。これはすべて、私が読んでいるC#の本に基づいており、プライベート変数を使用することが推奨されています。私は、ちょっとばかげているプロパティを取得/設定するために行っていたことから見ることができます。ありがとう。 – spickles

+0

どのような本ですか?私たちはそれを無視し、おそらくそれを嘲笑したいと思います。 –

答えて

1

これを行わないでください。

代わりにパブリックプロパティを使用すると、型の安全性が向上し、クラスの表現力がさらに強化されます。あなたの現在のアプローチでは、プロパティ名文字列のすべてのタイプミスは、コンパイルエラーの代わりに実行時例外を引き起こします。

だけでプロパティを使用します。

public class Car 
{ 
    public string Manufacturer {get; set;} 
    public string Model {get; set;} 
    public string Year {get; set;} 
    public string Color {get; set;} 

    //.. 
} 

今、あなただけの直接プロパティにアクセスすることができます

myCar.Manufacturer = "Ford"; 
labelManfValue.Text = myCar.Manufacturer; 

また、あなたがそうでなければ、あなたはいくつかのプロパティを持っているかもしれませんが、完全に車のオブジェクトを初期化するコンストラクタを定義する必要がありますセット、および他のものではない。

+0

オリジナルの投稿が編集されました。 – spickles

+0

コンストラクタを定義するには、プロパティをクラス定義に追加するだけですか、それともenumと関係がありますか?コンストラクタは 'public class Car(文字列メーカー)'のように見えますか – spickles

+0

はい - このようなものです。パブリック/プライベートの議論に関しては、あなたの例に基づいて、外部からこれらのプロパティへの*読み取りアクセス*が必要なので、少なくとも読み取り専用のプロパティだけでなく、プロパティもgetter/setterメソッドにコンパイルされます。同じタイプです。これは基本的に、あなたが設定メソッドで達成しようとしていたものと同等です。 – BrokenGlass

0

あなたは反射でこれを行うことができます。

void Main() 
{ 
    var foo = new Foo(); 
    foo.Set("bar","test"); 
    Console.WriteLine(foo.Get("bar")); 
} 
class Foo 
{ 
    string bar; 
    string bop; 

    public void Set(string name, string value) 
    { 
     GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance) 
       .SetValue(this, value); 
    } 

    public string Get(string name) 
    { 
     return (string)GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance) 
           .GetValue(this); 
    } 
} 

しかし、それはかなり悪い考えです。

+0

オリジナルの投稿が編集されました。 – spickles

関連する問題