2016-08-19 85 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來檢查和投射類型以獲取正確的屬性。

接口的意思正是爲了避免這種東西,隱藏實現細節。