Я изучаю ТВЕРДЫЕ принципы. Я сейчас работаю с принципами инжекции зависимостей и интерфейса. У меня уже есть основы этих двух, но когда я его объединил, я смутился. Вот моя реализация ..Впрыск конструктора с двумя различными интерфейсами (отдельная ответственность и разделение интерфейса)
class Person
{
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string Name { get; set; }
public int Age { get; set; }
}
class DisplayPerson
{
private readonly IWeapon iwep;
private readonly Person pers;
public DisplayPerson(IWeapon iwep, Person perss)
{
this.iwep = iwep;
this.pers = perss;
}
public void DisplayAll()
{
Console.WriteLine("Name: " + pers.Name + "\nAge: " + pers.Age + "\n" + "Weapon: "
+ iwep.weaponName() + "\nDamage: " + iwep.damage().ToString());
}
}
Я создал еще один класс для отображения информации, как правило, «S» в SOLID говорит, что класс не должен делать, который он не должен делать. И я думаю, что отображение этой информации не является ее задачей. (Пожалуйста, поправьте меня, если я ошибаюсь)
class Sword : IWeapon
{
private string weaponNames;
private int damages;
public Sword(string weaponName, int damage)
{
this.weaponNames = weaponName;
this.damages = damage;
}
public string weaponName(){ return this.weaponNames; }
public int damage(){ return this.damages; }
}
public interface IWeapon
{
string weaponName();
int damage();
}
С помощью этого интерфейса IWeapon, я могу теперь в состоянии добавить много оружия, которые имеют weaponName и повреждения. Но если я хочу добавить еще одно оружие с добавленными функциями, мы должны следовать принципу ISP, верно? Поэтому я создал этот интерфейс и класс ниже.
class Gun : IWeaponV1
{
private string weaponNames;
private int damages;
private int range;
public Gun(string weaponName, int damage, int range)
{
this.weaponNames = weaponName;
this.damages = damage;
this.range = range;
}
public string weaponName() { return this.weaponNames; }
public int damage(){ return this.damages; }
public int ranges() { return this.range; }
}
public interface IWeaponv1 : IWeapon
{
int range();
}
И я реализовал это так ..
static void Main(string[] args)
{
DisplayPerson disp = new DisplayPerson(new Sword("Samurai Sword", 100), new Person("Jheremy", 19));
disp.DisplayAll();
Console.ReadKey();
}
Моя проблема заключается в том, как я впрыснуть IWeaponv1 к классу DisplayPerson выше? Возможно ли это, или мое понимание принципов SOLID просто неверно. Пожалуйста, поправьте меня, если вы увидите, что я сделал что-то неправильно или плохой практику :)
Для этой структуры вы бы лучше использовать наследование, а не интерфейсы. Например. 'public abstract class Weapon {}' вместо 'IWeapon'. –
Я думаю, что классы в вашем коде являются новыми, а не инъекционными. См. Эту статью для получения дополнительной информации: http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/ –
Возможно, вы хотите преобразовать 'DisplayPerson' в« службу », называемую «PersonDisplayer», который берет оружие и человека (новые) как параметры метода, а не как зависимости. Взгляните на эту статью: https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99 –