2012-09-02 149 views
0

嗯,我不应该是第一个问这个问题的人。但我找不到解决我的问题。也许我只是不知道确切的术语。在类声明中声明未知类型c#

我目前正在编程(在C#中)必须处理不同类型的游戏玩家的程序。

即:

public class Gamer { 

    public int ID { set; get; } 
    public string Name { set; get; } 

public Gamer(int ID, string Name) 
{ 
    this.ID = ID; 
    this.Name = Name; 
} 

然后我不同类型玩家之间的分离(如国际象棋,围棋,高尔夫),谁拥有不同的属性:

public class ChessPlayer : Gamer { 

    public int ELORank { set; get; } 

    public ChessPlayer(int ID, string Name, int ELORank) 
    { 
    this.ID = ID; 
    this.Name = Name; 
    this.ELORANK = ELORank; 
    } 
} 

public class TennisPlayer : Gamer { 

    public int SinglesRank { set; get; } 
    public int DoublesRank { set; get; } 
    public bool LeftHanded { set; get; } 

    public TennisPlayer(int ID, string Name, 
         int SinglesRank, int DoublesRank bool LeftHanded) 
    { 
    this.ID = ID; 
    this.Name = Name; 
    this.SinglesRank = SinglesRank; 
    this.DoublesRank = DoublesRank; 
    this.LeftHanded = LeftHanded; 
    } 
} 

然后,我有一个静态类,其中我写下目前参与的游戏玩家:

public static class Game{ 
    public static int Type { set; get; } //0 = Chess, 1 = Tennis 
    public static var Gamer { set; get; } 
} 

这样我就可以在ButtonClick上写:

private void ButtonClick (Sender object, Event e) 
{ 
    ArrayList Participants = new ArrayList; 
    switch (Game.type) 
    { 
    case 0: //Chess 
    { 
     [...] //Add chess player to ArrayList 
     break; 
    Game.Gamer = Participants.ToArray(typeof(ChessPlayer)) as ChessPlayer[]; 
    } 
    case 1: //Tennis 
    { 
     [...] //Add tennis player to ArrayList 
     Game.Gamer = Participants.ToArray(typeof(TennisPlayer)) as TennisPlayer[]; 
     break; 
    } 

    } 
} 

嗯,我想这样做,但

public static var Gamer { set; get; } 

仅仅是不允许的,因为你不能有变种在你类的声明。

这就是为什么我目前使用AllGamer类,它具有ChessPlayer和TennisPlayer等的每个构造函数和属性。它正在工作。但我认为我最初的想法会更好。

我对c#很新,这是我第一个真正的OOP项目。所以,如果你有任何想法,我真的很希望听到/阅读它们。有没有可能使用未确定的类型或运行时确定类型(类似“var”)?

回答

1

因为ChessPlayer和TennisPlayer都是玩家,您可以创建类型玩家的属性

public Gamer TheGamer {get;set;} 

另一种方法是定义一个Interface,说IGamer,让你的球员实现该接口

public IGamer TheGamer {get;set;} 
+0

但ELORank,左手,..不是游戏玩家的属性 Game.TheGamer.ELORank 将不起作用 –

+0

如果您知道这是一个TennisPlayer,然后将其投掷到TennisPlayer。 – podiluska

+0

非常感谢。从来没有想过像这样的东西可以工作。我想知道内存分配是如何工作,如果我分配一个游戏玩家,但把一个游戏玩家加上额外的内容...我认为我可以做一些事情:'TennisPlayer Foo = new Gamer();'因为TennisPlayer有足够的内存对于玩家...而不是'Gamer Bar = new TennisPlayer();' –