2015-06-17 4 views
1

И я получаю эту ошибку:Истребитель класс не реализует интерфейс члена

Error 1 'Fight.Fighter' does not implement interface member 'Fight.IFighter.Utok(Fight.IFighter)'

Это первый раз, когда я пытаюсь научиться работать с интерфейсами, так что извините за самосвала вопрос.

Любые идеи?

У меня есть следующий код:

Интерфейс:

interface IFighter 
    { 
     string GraphicLife(); 
     bool IsLive(); 
     int Obrana(int utocneCislo); 
     void Utok(IFighter bojovnik); 
    } 
} 

Класс:

class Fighter : IFighter 
{ 
    protected string name; 
    protected int life; 
    protected int maxLife; 
    protected int attack; 
    protected int defence; 

    protected Kostka kostka; 

    public Fighter(string name, int life, int maxLife, int attack, int defence, Kostka kostka){ 
     this.name = name; 
     this.life = life; 
     this.maxLife = maxLife; 
     this.attack = attack; 
     this.defence = defence; 
     this.kostka = kostka; 
    } 

    public bool IsLive() 
    { 
     if (life > 0) 
     { 
      return true; 
     } 
     else return false; 
    } 

    public string GraphicLife() 
    { 
     int pozic = 20; 
     int numberOfParts = (int)Math.Round(((double)life/(double)maxLife) * (double)pozic); 
     string zivot = String.Concat(Enumerable.Repeat("#", numberOfParts)); 
     zivot = zivot + String.Concat(Enumerable.Repeat("_", pozic - numberOfParts)); 
     zivot = "[" + zivot + "]"; 
     return zivot; 
    } 

    public void Utok(Fighter warrior) 
    { 
     if (warrior.IsLive()) 
     { 
      int utok = (int)Math.Round((double)attack/(double)kostka.getPocetStran() * (double)kostka.getNumber()); 
      int obrana = warrior.Obrana(utok); 
      Console.WriteLine(this.name + "utoci na " + warrior.name + " silou " + utok + " " + warrior.name + " se brani silou " + obrana); 
      Console.WriteLine(this.name + " - " + this.life); 
      Console.WriteLine(this.GraphicLife()); 
      Console.WriteLine(warrior.name + " - " + warrior.life); 
      Console.WriteLine(warrior.GraphicLife()); 
     } 
     else Console.WriteLine(this.name + " utoci na mrtvolu"); 
    } 

    public int Obrana(int attackNumber) 
    { 
     int localDefence = (int)Math.Round((double)defence/ (double)kostka.getPocetStran() * (double)kostka.getNumber()); 
     int utok = attackNumber - localDefence; 
     if (utok < 0) utok = 0; 
     life = life - utok; 
     return localDefence; 
    } 

}} 
+0

Щелкните правой кнопкой мыши по интерфейсу в определении класса и выберите интерфейс реализации – Sayse

+0

Обратите внимание на сообщение об ошибке. Это говорит вам метод, вызывающий проблему (Utok), и тип параметра, который он ожидает от него (IFighter). –

ответ

4

Вы используете конкретный тип истребитель в списке параметров вашего метода вместо абстрактный тип IFighter.

Изменить следующую строку

public void Utok(Fighter warrior) 

Для

public void Utok(IFighter warrior) 

Вы должны использовать точный тип, определенный в интерфейсе, если вы реализуете его в классе.

Если вы определяете свои интерфейсы перед тем, как создать класс, который вы (наиболее распространенный способ), вы можете использовать хороший помощник, предоставленный Visual Studio, для выполнения некоторых работ для вас. Наведите указатель мыши на имя интерфейса и используйте «Реализовать интерфейсы» - функцию автоматического создания меток-заглушек для ваших интерфейсов.

Edit:

Вам нужно добавить свойство «Name» в интерфейсе, а также заставить его работать. Он должен быть имущество, которое необходимо по крайней мере, поглотитель:

string name { get; } 

Нормальная переменная вместо геттер не будет работать здесь, потому что интерфейсы не могут содержать переменные.

Доступны только свойства интерфейса, независимо от того, сколько классов фактически реализует этот интерфейс где-то еще в вашем приложении.

2

Для вашей сигнатуры метода для Utok требуется экземпляр IFighter вместо Fighter, как определено в вашем договоре с интерфейсом.

public void Utok(IFighter warrior) 
{ 
    // ... 
} 

To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

Это означает точно такую ​​же подпись.

+0

@aruzkaty: Это потому, что 'IFighter' не содержит этих вещей. Это похоже на кроличью нору проблем Лискова.Если это свойства, которые должен раскрывать любой «IFighter», они должны быть добавлены в качестве свойств этого интерфейса. – David

+0

Я вижу, я думал, что интерфейс может содержать только методы, а не переменные. – aruzkaty

+0

@aruzkaty: Правильно. Хотя свойства являются своего рода методом. – David

Смежные вопросы