0

我会尽力解释。我有 3 个课程:EnemyTeleport、EnemyZigZag、EnemyNormal。它们都继承基类 Enemy。这 3 个类中的每一个都有自己的 const -> KillPoints。

所以在其他班级。例如Form Class,我需要获取这些常量。这些 EnemyTeleport、EnemyZigZag、EnemyNormal 位于public Enemy EnemyInstance; 例如

EnemyInstance = new EnemyTeleport();

那么如何从 EnemInstance 中获得击杀点数呢?我不想检查每个可能的变体?

有更聪明的方法吗?

喜欢EnemInstance.GetType().KillPoints(不起作用)

再次。EnemyInstance 是持有 EnemyTeleport 的 Enemy 类型。常量保持在 EnemyTeleport

4

3 回答 3

2

为什么不使用 KillPoints 的属性扩展您的基类 Enemy。在继承类的构造函数中,您可以将 KillPoints 设置为某个敌人的特定值

但是,如果您不想将其放入基类中:

将 KillPoints 作为某个 Enemy 中的属性,例如:

public class TeleportEnemy : Enemy
{
   public int KillPoints{get;private set;}
   public TeleportEnemy()
   {
      this.KillPoints = 666;
   }
}

通过 Enemy 实例访问 Killpoint 的代码如下所示:

Enemy enemy = new TeleportEnemy();
        PropertyInfo propertyInfo = enemy.GetType().GetProperty("KillPoints");
        int value = (int)propertyInfo.GetValue(enemy, null);
于 2013-03-25T14:03:49.883 回答
1

我建议你使用

public abstract class Enemy
{
   public abstract List<int> KillPoints;
}

为每个特定的类定义值KillPoints(您可以使用 TemplateMethod 模式来计算您的 KillPoints)

链接: http: //www.dofactory.com/Patterns/PatternTemplate.aspx

但是在您的 Main 您使用基类 Enemy 为您的服务

所以 :

Enemy enemy = new EnemyTeleport();
var result = enemy.KillPoints;
于 2013-03-25T14:09:37.953 回答
0

您的层次结构可以定义如下。注意Enemy类是抽象的,而具体的敌人实现属性KillPoints。你的主要实现只需要知道抽象类Enemy,而具体的实现应该在其他地方创建,这取决于你游戏中的一些标志。

public abstract class Enemy
{
    public abstract int KillPoints {get;}
}

public class EnemyTeleport : Enemy
{
    public override int KillPoints
    {
        get{return 6;}
    }
}

public class EnemyZigZag : Enemy
{
    public override int KillPoints
    {
        get{return 10;}
    }
}

现在您可以利用多态调用 KillPoints

private Enemy EnemyInstance;

void Main()
{
    EnemyInstance = new EnemyTeleport();

    Console.WriteLine(EnemyInstance.KillPoints);
}
于 2013-03-25T14:05:02.597 回答