2016-08-19 52 views
-1

我在这里有点迷路。如何访问接口类型为c的阵列成员#

基本上,我需要访问一个数组项,一个字符串并显示它。这是代码。

namespace Test3_2_Practice 
{ 
public partial class InterfaceImplementation : Form 
{ 
    //Array 
    ICombatant[] combatants = new ICombatant[2]; 

    public InterfaceImplementation() 
    { 
     InitializeComponent(); 
    } 

    private void btnTest_Click(object sender, EventArgs e) 
    { 
     combatants[0] = new PlayerCharacter ("Conan" , 500); 
     combatants[1] = new MonsterCharacter ("Bob" , 5); 
     combatants[2] = new MonsterCharacter ("Snake" , 15); 

     string output = "Fighters" + Environment.NewLine; 

     for (var i = 0; i < combatants.Length; i++) 
     { 
      var character = combatants[i]; 
      output += "Character:" + combatants[i]. 
     } 
    } 
} 

}

所以,我有我的阵列,两种类型的实例组成战斗。我想访问名称“柯南”并将其添加到字符串输出。我该如何去做呢?如果有帮助,以下是其余的代码。谢谢!

namespace Test3_2_Practice 
{ 
//Interface 
interface ICombatant 
{ 
    int TakeDamage(int damageAmount); 
    string GetHealthDisplay(); 
} 

class PlayerCharacter : ICombatant 
{ 
    private string characterName; 
    private int currentHealth; 
    private int maxHealth; 

    public string CharacterName 
    { 
     get { return characterName; } 
     set { characterName = value; } 
    } 
    public int CurrentHealth 
    { 
     get { return currentHealth; } 
     set { currentHealth = value; } 
    } 
    public int MaxHealth 
    { 
     get { return maxHealth; } 
     set { maxHealth = value; } 
    } 

    public PlayerCharacter(string characterName, int maxHealth) 
    { 
     CharacterName = characterName; 
     CurrentHealth = MaxHealth = maxHealth; 
    } 

    //Damage Class 
    public int TakeDamage(int damageAmount) 
    { 
     if (damageAmount > currentHealth) 
     { 
      damageAmount = currentHealth; 
      return damageAmount; 
     } 
     else 
     { 
      currentHealth = currentHealth - damageAmount; 
      return damageAmount; 
     } 
    } 

    //Health Class 
    public string GetHealthDisplay() 
    { 
     return ("Health " + CurrentHealth.ToString() + "/" + MaxHealth).ToString(); 
    } 
} 

class MonsterCharacter : ICombatant 
{ 
    private string monsterName; 
    private int health; 

    public string MonsterName 
    { 
     get { return monsterName; } 
     set { monsterName = value; } 
    } 
    public int Health 
    { 
     get { return health; } 
     set { health = value; } 
    } 

    public MonsterCharacter(string monsterName, int health) 
    { 
     MonsterName = monsterName; 
     Health = health; 
    } 

    //Damage Class 
    public int TakeDamage(int damageAmount) 
    { 
     if(damageAmount > health) 
     { 
      damageAmount = health; 
      return damageAmount; 
     } 
     else 
     { 
      health = health - damageAmount; 
      return damageAmount; 
     } 
    } 

    //Health Class 
    public string GetHealthDisplay() 
    { 
     return "Health " + Health; 
    } 
} 
} 

回答

0

实际上,由于name是共同的接口的所有实施者是Name财产应包括接口本身一样

interface ICombatant 
{ 
    int TakeDamage(int damageAmount); 
    string GetHealthDisplay(); 
    public string CharacterName 
    { 
     get; 
     set; 
    } 
} 

在当前的情况下,您将收到投其特定的具体类型访问它

var character = combatants[i]; 
if(character is PlayerCharacter) 
    output += "Character:" + ((PlayerCharacter)character).CharacterName; 
+0

嘿,非常感谢。 –

0

更好地使用您的界面。在你的界面创建一个新的方法:

interface ICombatant 
{ 
    int TakeDamage(int damageAmount); 
    string GetHealthDisplay(); 
    string GetCombatantName(); // added this 
} 

中实现它这两个类然后实现:

class PlayerCharacter : ICombatant 
{ 

    // ... a lot of code ... 

    public string GetCombatantName() 
    { 
     return String.Format("Character: {0}", this.CharacterName); 
    } 
} 

class MonsterCharacter: ICombatant 
{ 

    // ... a lot of code ... 

    public string GetCombatantName() 
    { 
     return String.Format("Monster: {0}", this.MonsterName); 
    } 

} 

而且使用这样的:

private void btnTest_Click(object sender, EventArgs e) 
{ 
    combatants[0] = new PlayerCharacter("Conan", 500); 
    combatants[1] = new MonsterCharacter("Bob", 5); 
    combatants[2] = new MonsterCharacter("Snake", 15); 

    string output = "Fighters" + Environment.NewLine; 

    foreach (var combatant in combatants) 
    { 
     output += combatant.GetCombatantName(); 
    } 
} 

所以,如果有一天你十种不同类型的ICombatant(如AnimalCharacter,VirusCharacter),您不必嵌套很多ifs来检查和投射类型以获取正确的属性。

接口的意思正是为了避免这种东西,隐藏实现细节。