2011-11-24 49 views
4

嗨,我是OOP的新手,需要帮助解决一些小问题。 我使用了一个名为Monsters的集合来存储3种类型的对象。蜘蛛,农民,咕噜(无关)。 我作为一个索引器集合,但当我用它来获取对象的集合时,该对象是无类型的,但我真的需要TypeCast我的下一个操作。获取混合类型集合中的对象

private void Form1_Load(object sender, EventArgs e) 
    { 
     CurrentOpponent Opponent = new CurrentOpponent(); 
     Gollum myGollum = new Gollum(); 
     AngryFarmer myFarmer = new AngryFarmer(); 
     Ugly_Spider mySpider = new Ugly_Spider(); 
     myMonsters.AddGollum(myGollum); 
     myMonsters.AddFarmer(myFarmer); 
     myMonsters.AddUgly(mySpider); 
     progressBar1.Increment(100); 
     progressBar2.Increment(100); 
     Monster myCurrentOpponent = Opponent.randomEncounter(); 
     //textBox1.Text = (this is where i need the type for a cast)myCurrentOpponent.name 
    } 

这里是我提取物

class CurrentOpponent 
    { 
     public Monster randomEncounter() 
     { 
      Random _random = new Random(); 
      int opp = _random.Next(4); 
      return myMonsters[opp]; 

     } 

最后索引至极返回一个怪物(所有3个怪物种类的母公司)

public Monster this[int xxx] 
    { 
     get 
     { 
      return (Monster)List[xxx]; 
     } 
    } 

帮助将是真正的randomEncounter理解.. !! 在此先感谢

+1

'class'和'public'前面的'$'是什么? – Ryan

+0

我想我不得不把这个引用一个代码部分对不起 – phadaphunk

回答

4

理想的情况下,AngryFarmerUgly_SpiderGollum都应该从Monster继承:

public class AngryFarmer : Monster 
{ 
    // ... 
} 
// etc. 

然后,您可以只使用一个List<Monster>

myMonsters = new List<Monster>(); 
myMonsters.Add(new AngryFarmer()); // works because AngryFarmer is a kind of Monster 

这将允许你使用多态。

+0

好吧我所有的怪物类继承自怪物,但我如何提取对象而不失去它的类型?所有这一切的目的是在myMonsters集合中获得一个随机怪物,并将提取的object.name分配给textbox1.Text,但编译器会问一个我不会提供的类型转换,因为每次都从该集合中随机提取对象。 。 – phadaphunk

+3

把怪物(比如名字)常见的所有东西都放到“Monster”中。那么你不需要沮丧。 –

+0

它不会失去它的类型......但是......怪物应该有一个“名称”属性,每个子类ovrrides –

0

你需要使用界面...... IMonster ..... IMonster然后有一个名字

然后让所有的怪物实现IMonster

,只是有IMonsters

的列表
0

您可能还想通过使用接口来尝试它!看看...

public interface IMonster 
{ 
    String Name { get; } 
    Int32 Health { get; set; } 
} 

public class Spider : IMonster 
{ 
    public Spider() 
    { 
     _health = 100; 
    } 

    public string Name 
    { 
     get { return "Spider"; } 
    } 

    private int _health; 
    public int Health 
    { 
     get { return _health; } 
     set { _health = value; } 
    } 
} 

public class Gollum : IMonster 
{ 
    public Gollum() 
    { 
     _health = 250; 
    } 

    public string Name 
    { 
     get { return "Gollum"; } 
    } 

    private int _health; 
    public int Health 
    { 
     get { return _health; } 
     set { _health = value; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<IMonster> monsters = new List<IMonster>() 
             { 
              new Gollum(), 
              new Spider() 
             }; 

     IMonster randomMonster = GetRandomMonster(monsters); 
     Console.WriteLine(randomMonster.Name + "/" + randomMonster.Health); 
    } 

    private static IMonster GetRandomMonster(List<IMonster> monsters) 
    { 
     //Your code for getting a random monster goes here! 
     throw new NotImplementedException(); 
    } 
} 

我很喜欢这种做法......想象一下,你有一个最初不完全是一个怪物在你的游戏的元素。说你的游戏是一个随机元素,在一个特定的事件之后,它变成了一个怪物,你的英雄(比如像英雄般强大和魔法的游戏)必须与之战斗。如果您决定在创建游戏后很长时间添加此功能,则更改该功能会变得有害/困难/风险,因为此元素可能已经从另一个类继承。如果你使用的是接口,你可以简单地在这个实体上实现它,并且它将立即能够像你游戏中的任何其他IMonster一样运行。这意味着这个随机实体可以作为参数传递给方法Fight(IHero hero,IMonster怪物);

0

理想的情况下,AngryFarmerUgly_SpiderGollum都应该继承 从Monster

我了解你的问题,像俄罗斯方块游戏的问题: 1 /你有怪物像我有形状。每个怪物都有它自己的属性(生命值,魔法值,......)和行为(攻击,跑,施放法术......),就像块有属性(颜色,位置,状态......)和 行为(向下,向右旋转,向左旋转,...)

在游戏场景中,您想随机选择一个具有特定属性和行为的怪物,比如我想随机选择一个形状。如果是你的问题,你可以试试我的代码:

public abstract class CMonster 
{ 
    int _HP; 
    int _MP; 
    //..and something like this 
    public int HP 
    { 
     get { return this._HP; } 
     set { this._HP=value;} 
    } 
    public int MP 
    { 
     get { return this._MP; } 
     set { this._MP = value; } 
    } 

    public abstract void Run(); 
    public abstract void Attach(); 
    public abstract void CastSpell(); 
} 

public class CUgly_Spider : CMonster 
{ 
    public CUgly_Spider() 
    { 
     this.MP = 100;//your value here 
     this.HP = 100;//your value here 
    } 
    public override void Attach() 
    { 
     //your implemetation here 
    } 

    public override void Run() 
    { 
     //your implemetation here 
    } 

    public override void CastSpell() 
    { 
     //your implemetation here 
    } 
} 


public class CGollum : CMonster 
{ 
    public CGollum() 
    { 
     this.MP = 100;//your value here 
     this.HP = 100;//your value here 
    } 
    public override void Attach() 
    { 
     //your implemetation here 
    } 

    public override void Run() 
    { 
     //your implemetation here 
    } 

    public override void CastSpell() 
    { 
     //your implemetation here 
    } 
} 

class Test 
{ 
    private void InitTheGame() 
    { 
     CMonster curMonster=null; 
     Random rnd = new Random(); 
     //sample random 
     if ((rnd.Next() % 2) == 0) 
     { 
      curMonster = new CGollum(); 
     } 
     else 
     { 
      curMonster = new CUgly_Spider(); 
     } 

     curMonster.Run();//when (rnd.Next() % 2) == 0 then the Gollum is doing else the Ugly_Spider 
     curMonster.Attach();//when (rnd.Next() % 2) == 0 then the Gollum is doing else the Ugly_Spider 
     curMonster.CastSpell();//when (rnd.Next() % 2) == 0 then the Gollum is doing else the Ugly_Spider 
    } 
} 

我希望能帮到你。