C++/CLIをつつく18-多態性1-メソッドオーバーライド。親子でも違う事はある。
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;
Animal ( String^ name, Int32 age ) {
this->Name = name;
this->Age = age;
}
//ここを修正
//Moveとの違いはabstractが無いことピヨ
virtual void Talk( ) {
Console::WriteLine( "私は{0}。年は{1}だよ。",
this->Name, this->Age);
}
virtual void Move() abstract;
};
public ref class Human : Animal
{
public:
Human ( String^ name, Int32 age ) : Animal( name, age ) { }
//これがメソッドオーバーライド
virtual void Talk() override {
Console::WriteLine( "私は{0}。年は20だよ。", this->Name );
}
virtual void Move() override {
Console::WriteLine( "テクテクテクテク" );
}
};
このコードを実行してみよう。これでHumanクラスは実年齢に関係なく二十歳を名乗ることになるよ。
ドリィちゃんそこまでするか・・・おっほん。それはともかく、このようにして基本となるクラスのメソッドにvirtual キーワードを付け加えることにより派生クラス(継承したクラスの事)が メソッドの定義を書き換えることが出来るよ。 これがメソッドオーバーライド機能ピヨ。 この機能は便利だから多用するよ。だからしっかり覚えよう。 それで、どのような時virtualキーワードをつければいいかなんだけど、基本的には同じ動きなんだけど、 たまに動きを変えたい場合に使用するといいピヨ。 もしそのメソッドが派生クラスごとに動きが違う場合はabstractキーワードをつけた方がいいピヨ。上手に使い分けてね。
メソッドオーバーライドについてはこれで終わりピヨ。
おっと忘れるところだった。注意が1点あるピヨ。C#の場合はオーバーライドするメソッドにvirtualキーワードがなかったけど、 C++/CLIではoverrideキーワードとvirtualキーワードの両方が要るピヨ。注意してね。
今度こそ最後の纏めに入るピヨ。多態性で最後といったことあるけど、オブジェクト指向についてつっつくことはまだあるから、次回からは今まで紹介できなかった細かな所をつっつくピヨ。 覚えたら覚える程得をするので、身構えずにリラックスして楽しんでね。