Character[] PlayerOne = new Character[5];
PlayerOne[1] = new BladeWarrior();
PlayerOne[2] = new FistWarrior();
PlayerOne[3] = new Archer();
PlayerOne[4] = new RedMage();
PlayerOne[5] = new BlueMage();
我知道通过多态性,BladeWarrior 可以是角色,但反之则不行。我的问题是当我尝试访问数组的元素时。例如 Player[1],我无法访问 BladeWarrior 类中的函数和变量。它只允许我从 BladeWarrior 类继承的 Character 类访问变量和函数。
如果我想要 2 个角色进行战斗,我将需要能够访问 Bladewarrior 函数/变量。
我在想我可以使用“as”函数将 PlayerOne[1] 设置为特定对象。不完全是这样:
string s = objArray[i] as string;
上面的代码行只是为了了解我所说的“as”。
这个问题的解决方案是什么?
最佳答案
I'm going to need to be able to access Bladewarrior functions/variables if Im going to want 2 characters to fight.
看起来您正在尝试进行多次分派(dispatch):您想要调用
Fight(PlayerOne[i], PlayerOne[j]);
调用一个知道两个字符的确切类型的函数。您可以使用不同的技巧在单一调度语言中实现双重调度,最值得注意的是 visitor pattern。 .从 C#4 开始,您还可以使用 dynamic
以相对简洁易读的方式实现双重分派(dispatch):
static class FightArena {
public static void Fight(dynamic a, dynamic b) {
try {
DoFight(a, b);
} catch {
Console.Error.WriteLine("{0} and {1} cannot fight", a, b);
}
}
private static void DoFight(BladeWarrior a, Archer b) {
}
private static void DoFight(BladeWarrior a, FistWarrior b) {
}
private static void DoFight(BladeWarrior a, RedMage b) {
}
private static void DoFight(BladeWarrior a, BlueMage b) {
}
private static void DoFight(BladeWarrior a, BladeWarrior b) {
}
private static void DoFight(Archer a, Archer b) {
}
... // Enumerate all pairs that can fight
}
现在你可以这样写:
FightArena.Fight(PlayerOne[i], PlayerOne[j]);
并且调用将根据 PlayerOne[i]
和 PlayerOne[j]
的动态类型到达精确的类型对。
关于c# - 如何从 C# 中的类对象数组访问属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20773654/