はじめに
今回の内容は、下記記事の続きになります。
クラスは何記事かにわけて解説予定です。
はじめに こうちゃ こんにちは、こうちゃです。 今回は、C#のクラス作成においてメンバ関数を実装する方法を説明していきます。 今回の内容は、下記記事の続きになります。 クラスは何記事かにわけて解説予定で、前回に続き[…]
- インターフェースとはなにか
- インターフェースの使い方
- クラスを作成したい方
- オブジェクト指向に興味のある方
インターフェースとは
これまではモブのみを考えていましたが、RPGには弱いモブ、強いモブ、ボスなどいろいろいます。
これらは共通して 敵キャラ と言えます。
そしてこの敵キャラは、攻撃する という共通の機能 (行動) を持っているとしましょう。
このような場合に、「敵キャラ」というインターフェースを作成し、攻撃する という機能を持たせることができます。
クラスが設計書であったのに対し、インターフェースは 設計書を作成する上で守るべき仕様書 と言えます。
インターフェースの作り方
今回はIEnemyという「敵キャラ」インターフェースを作成します。
namespace Characters
{
interface IEnemy
{
void Attack();
}
}
C#でインターフェースを作成するポイントとしては以下の3点になります。
- 「interface」キーワードを使用する
- メソッドを定義するのみで、処理は記述しない
- アクセス修飾子は通常記載しない(public扱い)
このIEnemyインターフェースでは Attackメソッドを実装すること ということのみをルールとして定義しています。
インターフェースの実装方法
インターフェースは単体では使用することができません。
クラスに実装して、初めて意味を持ちます。
今回は、作成したIEnemyインターフェースを使用したクラスを2つ作成します。
MobWeakクラス
namespace Characters
{
class MobWeak : IEnemy
{
// メンバ変数
private string name; // 固有名
/// <summary>
/// コンストラクタ1つ目(インスタンス生成時に呼ばれる)
/// </summary>
/// <param name="uniqueName">固有名</param>
public MobWeak(string uniqueName)
{
// 固有名は引数で渡してもらう
name = uniqueName;
Console.WriteLine($"{name} が生成されました。");
}
/// <summary>
/// IEnemyインターフェースのAttackメソッド実装
/// </summary>
public void Attack()
{
Console.WriteLine($"{name}は1回攻撃した!");
}
}
}
MobStrongクラス
namespace Characters
{
class MobStrong : IEnemy
{
// メンバ変数
private string name; // 固有名
/// <summary>
/// コンストラクタ1つ目(インスタンス生成時に呼ばれる)
/// </summary>
/// <param name="uniqueName">固有名</param>
public MobStrong(string uniqueName)
{
// 固有名は引数で渡してもらう
name = uniqueName;
Console.WriteLine($"{name} が生成されました。");
}
/// <summary>
/// IEnemyインターフェースのAttackメソッド実装
/// </summary>
public void Attack()
{
Console.WriteLine($"{name}は2回攻撃した!");
}
}
}
MobWeakとMobStrongという2つのモブクラスを作成しました。
インターフェースの実装ポイントは以下の3点です。
- 「class クラス名 : インターフェース名」という形式でクラスを作成する
- 「: インターフェース名」のインターフェースで定義されているメソッドを実装する
(今回はAttackメソッドが該当) - 実装するメソッドの中身は、クラス毎に変えられる
(MobWeakでは1回、MobStrongでは2回攻撃している)
このように、IEnemyインターフェースで定義された Attackメソッドを実装すること というルールを守る必要があります。
インターフェースの使い方
インターフェースを定義し、実装もできました。
なので次は、インタフェースを使っていきましょう。
using Characters;
namespace Main
{
class Program
{
static void Main(string[] args)
{
// インスタンス化
IEnemy weak = new MobWeak("弱モブ1");
IEnemy strong = new MobStrong("強モブ1");
// リスト化
List<IEnemy> enemies = new List<IEnemy>();
enemies.Add(weak);
enemies.Add(strong);
// 攻撃実行
foreach (IEnemy enemy in enemies)
{
enemy.Attack();
}
}
}
}
MobWeakとMobStrongというクラスのインスタンスを作成しますが、あくまでIEnemy型としてインスタンス化します。
そうすることで、IEnemy型のList (enemies) にMobWeak、MobStrongどちらのインスタンスも追加することができます。
IEnemyインターフェースはAttackメソッドの実装を約束していますので、enemiesをforeach文でまわし、それぞれの要素 (インスタンス) にAttackメソッドをコールさせることができるようになっています。
さあ、このコードを実行するとどうなるのでしょうか、見ていきましょう。
実行結果
弱モブ1 が生成されました。
強モブ1 が生成されました。
弱モブ1は1回攻撃した!
強モブ1は2回攻撃した!
上記のような結果になるはずです。
コードとしては、あくまでenemiesというIEnemy型リストの各要素 enemy でAttackメソッドをコールしたのみでした。
その結果として、
- MobWeakインスタンス:1回攻撃
- MobStrongインスタンス:2回攻撃
と、同じAttackメソッドを呼び出しても動作が異なります。
このような性質を ポリモーフィズム (多態性) と言います。
クラスを使用したオブジェクト指向プログラミングを行う上で、ポリモーフィズムはとても重要になるので、覚えておきましょう。
さいごに
今回は、インターフェースについて説明してきました。
最後には、とても重要なポリモーフィズムという性質が登場しましたね。
インターフェースが分かり始めると、抽象クラス や 仮想関数 などもわかるようになってきます。
次回以降に解説していこうと思います。
今回はここまで♪
楽しいプログラミングライフを!