無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

C#をつつく19−プロパティ1−読み取り専用プロパティ。ころころ変更はまずいっすよ。

早速だけど、前回までに作ったクラスは致命的なミスがあるんだ。そのミスを示すコードを見てピヨね。
static void Main( string[ ] args ) {
    Bird tori = new Bird( "インドリ", 29);
    tori.Move( );
    Console.WriteLine( "{0}参上!", tori.Name);
    tori.Talk( );
    Console.WriteLine( );

    Human dre = new Human( "ドリィちゃん", 16 );
    dre.Move( );
    Console.WriteLine( "{0}参上!", dre.Name );
    dre.Talk( );
    Console.WriteLine( );

    //名前も年齢も簡単に変えられる!
    Console.WriteLine( "へーしん。" );
    tori.Name = "怪盗20面相";
    tori.Age = 2000;
    tori.Move( );
    tori.Talk( );
    Console.WriteLine( );
}

これおかしいよね。だって、NameプロパティとAgeプロパティが何の制限もなく自由に変更できたら、 瞬間的に人や鳥が別人(別鳥)になってしまうから論理的におかしくなってしまうピヨ。 これじゃあ、まともな動物園のソフトはつれないよね。
これを防ぐにはプロパティを読み取り専用にすればいいピヨ。 やり方は簡単早速変更してみよう。
public abstract class Animal
{
    private string m_Name;

    //読み取りしか出来ない!
    public string Name {
        get { return m_Name; }
    }
    private int m_Age;

    public int Age {
        get { return m_Age; }
        set {
            if ( value > 0 ) m_Age = value;
        }
    }

    public Animal( string name, int age ) {
        this.m_Name = name; 
        this.Age = age;
    }

    public virtual void Talk( ) {
        Console.WriteLine( "私は{0}。年は{1}だよ。",
            this.m_Name, this.m_Age );
    }

    public abstract void Move( );
}

Ageプロパティは年齢が変わる事があるからひとまずおいておくことにして、Nameプロパティを読み取り専用にしたピヨ。 早速コンパイルしてみよう。エラーが出るピヨ。 コンストラクタでも発生するからちょっと面倒だけどそれは仕方ないよね。
set { プログラム } 
を消すだけで良いんだ簡単だね。簡単すぎて面白くないから一つ豆知識を披露するピヨ。
この消したsetはSetter(セッター)と呼び、getは Getter(ゲッター)と呼ぶんだ。覚えておいて損は無いピヨ。
これでこの記事はお終い。次は何をつっつこうかな♪
別窓 | C# | コメント:0 | トラックバック:0 | ∧top | under∨
<<C++/CLIをつつく19−プロパティ1−読み取り専用プロパティ。ころころ変更はまずいっすよ。 | 無差別に技術をついばむ鳥 | 企画の紹介>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |