Вопрос:

Внедрение зависимостей в C #

c# .net c#-4.0 design-patterns

2718 просмотра

1 ответ

2064 Репутация автора

Я изучаю внедрение конструктора из этого источника https://softwareengineering.stackexchange.com/questions/177649/what-is-constructor-injection

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

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

class Samurai
{
    readonly IWeapon weapon;
    public Samurai() 
    {
        this.weapon = new Sword();
    }
    public void Attack(string target) 
    {
        this.weapon.Hit(target);
    }
}

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

class Samurai
{
    readonly IWeapon weapon;
    public Samurai(IWeapon weapon) 
    {
        this.weapon = weapon;
    }
    public void Attack(string target) 
    {
        this.weapon.Hit(target);
    }
}

Может кто-нибудь помочь мне понять, почему мы не создаем объект Sword с помощью "new"ключевого слова во втором фрагменте и как он работает без этого? Вышеупомянутые два фрагмента одинаковы? А также, как это теряет связь?

Автор: Learner Источник Размещён: 09.11.2013 04:56

Ответы (1)


6 плюса

851 Репутация автора

Решение

Передача реализации IWeapon позволяет вам иметь столько версий оружия, сколько вы пожелаете, с любым объектом, который вы решите создать, при условии, что он имеет один и тот же открытый интерфейс.

Вы могли бы создать объект Gun или Sword, который использует интерфейс IWeapon, и ваш класс самураев не заботился бы. Использование newключевого слова внутри вашего класса не позволяет вам сделать это. Вместо этого вы вынуждены использовать только одну реализацию, о которой Самурай знает (потому что он ее создал). Поэтому, если вы захотите добавить другое оружие позже, вам придется изменить класс самураев. Подобная реализация Samurai особенно сложна, если вы представляете его как API другим разработчикам, потому что они не захотят копаться в вашем коде.

Итак, вы бы сделали что-то вроде этого:

Gun gun = new Gun();
Samurai samurai = new Samurai(gun);

Реализация будет выглядеть так:

public class Gun : IWeapon { // Implementing IWeapon, and typecasting the class into a Weapon
   public Attack(string target) {
     // Perform attack logic here
   }
}

Ваш интерфейс выглядит так:

public interface IWeapon {
  void Attack(string target);
}
Автор: Walt Weidner Размещён: 09.11.2013 05:06
Вопросы из категории :
32x32