Как передать значения для полей класса, который объявляется через интерфейс

297
07 апреля 2017, 20:25

Заголовок скорей всего не передает сути вопроса. Имеется два интерфейса:

public interface IAttackParameters
{
    double MagicAttack { get; set; }
    double PhysicAttack { get; set; }
}
public interface Player
{
   int Health { get; set; }
   IAttackParameters AttackParameters { get; set; }
   // other fields...
}

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

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

public class Player : IPlayer
{
   public int Health { get; set; }
   public IAttackParameters AttackParameters { get; set; }
   public void SetAttackParameters()
   {
        AttackParameters.MagicAttack = 10; // не работает
        IAttackParameters.MagicAttack = 10; // не работает
   }
}

Говорят что можно так:

public class Player : IPlayer
{
   public int Health { get; set; }
   public IAttackParameters AttackParameters { get; set; }
   // Explicityly implement my interface
   IAttackParameters IAttackParameters.AttackParameters 
   {
       get { return AttackParameters; }
   }
}

но что-то не красиво как то и не факт что будет работать. Может есть какой то более простой способ, так как ситуация должна быть довольно часто встречающейся.

Answer 1

Делаем реализацию обоих интерфейсов:

  public class AttackParameters : IAttackParameters
  {
    public double PhysicAttack { get; set; }
    public double MagicAttack { get; set; }
  }
  public class Player : IPlayer
  {
    public int Health { get; set; }
    public IAttackParameters AttackParameters { get; set; }
    public Player()
    {
      this.AttackParameters = new AttackParameters();
    }
    public void SetAttackParameters()
    {
      AttackParameters.MagicAttack = 10;
    }
  }

В итоге, наружу из Player торчит только интерфейс IAttackParameters, реализации могут быть любыми, можно пользоваться.

Answer 2

Интерфейсы требуют реализации. Но ваше 5-ое чувство Вас не обманывает, и то что вы хотите, реализуется с помощью Dependency Injection. Способ используемый для уменьшения связанности кода,неплохим выбором будет Ninject, как это работает хорошо объясняется тут

READ ALSO
StringSplitOptions.RemoveEmptyEntries сразу для нескольких методов Split

StringSplitOptions.RemoveEmptyEntries сразу для нескольких методов Split

ПриветствуюМожно ли использовать перечисление StringSplitOptions

289
Отправка смс на указанный номер ASP.NET MVC 5

Отправка смс на указанный номер ASP.NET MVC 5

Допустим есть форма на сайте, в нее вбивается телефон, затем по нажатию кнопки на указанный номер отправляется сообщение

311
Получить значение из текста

Получить значение из текста

Есть текст "myservercom/?download_file=41&wccc_key_email=email&key=key" Как получить из всего этого только значение после "/?download_file" ? В моем случае это 41

255