これが私のインターフェースです
interface IEnemy
{
int Health { get; set; }
}
そしてそれから派生するいくつかのクラス
public class Goblin : IEnemy
{
public int Health { get; set; }
public Goblin()
{
Health = 50;
Console.WriteLine("You encounter an Enemy Goblin!");
}
}
public class Undead : IEnemy
{
public int Health { get; set; }
public Undead()
{
Health = 100;
Console.WriteLine("You encounter an Enemy Undead!");
}
}
public class Orc : IEnemy
{
public int Health { get; set; }
public Orc()
{
Health = 150;
Console.WriteLine("You encounter an Enemy Orc!");
}
}
そして、スポーンする敵を選択するランダマイザーを作りたいとしましょう---私はこのようなものを作ります
IEnemy enemy = new Goblin() or Undead() or Orc()...
そして、すべてが意図したとおりに機能しますが、たとえば、1つのオブジェクト(たとえばゴブリン)にインターフェイスにないメソッドがある場合、敵のタイプがIEnemyの場合、そのメソッドを呼び出すにはどうすればよいですか?
あなたは書ける
if (enemy is Goblin goblin) {
goblin.CallGoblinMethod();
}
しかし、問題はこれが良いデザインであるかどうかです。異なるオブジェクトで異なる方法で実装される、普遍的な「味」を持つメソッドを持つことが望ましいでしょう。一部のオブジェクトでは空になることもあります。
または、別のインターフェースを介して動作を一般化することもできます
interface IThief
{
void Steal();
}
public class Goblin : IEnemy, IThief
{
public int Health { get; set; }
public Goblin()
{
Health = 50;
Console.WriteLine("You encounter an Enemy Goblin!");
}
public void Steal()
{
//TODO: steal
}
}
このように、敵がゴブリンであることを知る必要さえありません。同じ能力を持つ他のクリーチャーがゲームの進化に現れる可能性があります。
if (enemy is IThief thief) {
thief.Steal();
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加