C++/CLIをつつく19-プロパティ1-読み取り専用プロパティ。ころころ変更はまずいっすよ。
using namespace Sample;
int main(array< System::String ^> ^args)
{
Bird^ tori = gcnew Bird( "インドリ", 29);
tori->Move( );
Console::WriteLine( "{0}参上!", tori->Name);
tori->Talk( );
Console::WriteLine( );
Human^ dre = gcnew 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( );
return 0;
}
これおかしいよね。だって、NameプロパティとAgeプロパティが何の制限もなく自由に変更できたら、 瞬間的に人や鳥が別人(別鳥)になってしまうから論理的におかしくなってしまうピヨ。 これじゃあ、まともな動物園のソフトはつれないよね。
これを防ぐにはプロパティを読み取り専用にすればいいピヨ。 やり方は簡単早速変更してみよう。
public ref class Animal abstract
{
private:
Int32 m_age;
String^ m_name;
Animal(){}
public:
property Int32 Age {
Int32 get() { return this->m_age; }
void set( Int32 value ) {
if ( value > 0 ) m_age = value;
}
}
//読み取りしか出来ない
property String^ Name {
String^ get() { return this->m_name; }
}
Animal ( String^ name, Int32 age ) {
this->m_name = name;
this->Age = age;
}
virtual void Talk( ) {
Console::WriteLine( "私は{0}。年は{1}だよ。",
this->Name, this->Age);
}
virtual void Move() abstract;
};
Ageプロパティは年齢が変わる事があるからひとまずおいておくことにして、Nameプロパティを読み取り専用にしたピヨ。 早速コンパイルしてみよう。エラーが出るピヨ。 コンストラクタでも発生するし、省略記法を使えなくなるからちょっと残念だけどそれは仕方ないよね。
型名 set { プログラム }を消すだけで良いんだ簡単だね。簡単すぎて面白くないから一つ豆知識を披露するピヨ。
この消したsetはSetter(セッター)と呼び、getは Getter(ゲッター)と呼ぶんだ。覚えておいて損は無いピヨ。
これでこの記事はお終い。次は何をつっつこうかな♪