C#をつつく17-多態性。曖昧なものを具体化。
public abstract class Animal
{
private string m_Name;
public string Name {
get { return m_Name; }
set { m_Name = value; }
}
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.Name = name;
this.Age = age;
}
public void Talk( ) {
Console.WriteLine( "私は{0}。年は{1}だよ。",
this.m_Name, this.m_Age );
}
//ここに機能を追加
public abstract void Move( );
}
さっそくこのコードをコンパイルしてね。 コンパイルしたら・・・
'Bird' は継承抽象メンバ 'Animal.Move()' を実装しません。
'Human' は継承抽象メンバ 'Animal.Move()' を実装しません。
とC#コンパイラに怒られるピヨ。でも、これでいいんだ。 こうすることによって、新しいDogクラスとかを作る際にMoveメソッドの実装を忘れないで済むんだ。
C#コンパイラに怒られたからMoveメソッドを実装してみよう。
public class Bird : Animal
{
public Bird( string name, int age ) : base ( name, age ) { }
public override void Move( ) {
Console.WriteLine( "バサバサバサバサ" );
}
}
public class Human : Animal
{
public Human( string name, int age ) : base( name, age ) { }
public override void Move( ) {
Console.WriteLine( "テクテクテクテク" );
}
}
class Program
{
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( );
}
}
このコードを実行してごらん。同じ同じMoveメソッドでも実行結果が違うピヨ。
これが多態性(ポリモーフィズム)なんだ。突然だけど、長すぎると読みにくいので次回へ続く。