2016-12-24 9 views
0

У меня в принцип инверсии зависимостей и инверсию управления совсем недавно, и от того, что я в настоящее время знаю (поправьте меня, если я ошибаюсь), что DIP утверждает, что модульDependency Injection Проблема

высокого уровня/класс не должен зависеть от модуля низкого уровня/класса

как высокого и модуль низкого уровня не должен зависеть от деталей (не уверен, что означает, что это один ???), но абстракции (интерфейсы)

но когда я писал простую программу реализовать этот принцип, я столкнулся с проблемой (объясню позже)

Моя программа состоит из инвентаря и класса игрока, который реализует «ICharacterable»

 class Player : ICharacterable { 

    private int _health = 100; 

    public int Health{ 

     get{ 
      return _health; 
     } 

    } 

    public int HealthIncrease(int health){ 
     //increase health 
     return _health + health; 

    } 


} 

class Inventory{ 

    ICharacterable player = null; 

    //constructor injection 
    public Inventory(ICharacterable player) { 

     this.player = player; 

    } 

    //increase player health 
    public void UseHealthPotion(int health) { 

     player.HealthIncrease(health); 

    } 

} 

class Program{ 
static void Main(string[] args) { 

    Player john = new Player(); 
    Inventory inv = new Inventory(john); 

    inv.UseHealthPotion(30); 
    Console.WriteLine(john.Health); 

} 

} 

//interface 
public interface ICharacterable { 

    int HealthIncrease(int health); 

} 

проблема, консоль возвращает 100 вместо из 130. Я полагаю, что проблема возникла из-за того, что я объявил, что вместо инъекции вводит тип ICharacterable, но это может нарушить DIP, есть ли способ сделать это? Благодаря

+0

Сторона не о модели, «Инвентарь HAS-Player» звучит странно. И кто пьет зелья, игроки или инвентарь? –

+0

Почему «HealthIncrease» возвращает что-нибудь?Я либо изменил бы состояние (то есть увеличил поле здоровья игрока), либо выполнил бы и вернул бы сумму, я бы не стал делать то и другое, это побочный эффект. – weston

ответ

1

Вы получаете плохой результат, потому что ваш метод возвращает только результат сложения и не меняет состояние объект. Все остальное верно. Измените его на:

public int HealthIncrease(int health){ 
    //increase health 
    _health += health; 
    return _health; 
} 

Вы должны рассматривать только небольшую замену, на мой взгляд игрока должна содержать Inventory, а не наоборот. Затем вы будете следовать шаблонам проектирования ООП, и ваш код будет намного лучше.

высокого уровня модуль/класс не должен зависеть от низкого уровня модуль/класс

В этом случае игрока = класс высокого уровня и инвентаризации класса = низкого уровня

как высокие и низкий уровень модуль не должен зависеть от деталей (не уверен, что означает, что это один ???), но абстракции (интерфейсы)

Краткое объяснение:

Абстракции = интерфейс или абстрактный класс. Довольно легко понять, это ваш Интерфейс ICharactable.

= осуществление. Это ваш Инвентарь класс. Что делает ваш код совместимым с этим принципом.

+0

Эй, не могли бы вы подробно остановиться на «Вы должны только рассмотреть небольшую замену, на мой взгляд, плеер должен содержать инвентарь. Затем вы будете следовать шаблонам проектирования ООП, и ваш код будет намного лучше». Мне сказали, что у каждого класса должна быть только одна ответственность, и как я могу извлечь из этого выгоду? спасибо – Lef

+0

@Lef это правда, это не меняет такого поведения. Я имею в виду - у игрока должен быть Инвентарь как зависимость, а не наоборот. –

+0

@Lef см. Мой обновленный ответ –

2

Это не проблема инъекции зависимостей, вы просто ошибка в коде здесь:

public int HealthIncrease(int health){ 
     //increase health 
     return _health += health; 

    } 
+0

oops Как я мог пропустить это, спасибо – Lef