Я изучаю принципы SOLID. Сейчас я работаю с принципами внедрения зависимостей и разделения интерфейса. У меня уже есть основы этих двух, но когда я объединил их, я запутался. Вот моя реализация..
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 я теперь могу добавлять множество видов оружия, у которых есть имя оружия и урон. Но если я хочу добавить еще одно оружие с дополнительными функциями, мы должны следовать принципу 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
. - person Chris Pickford   schedule 12.01.2017DisplayPerson
в сервис под названием PersonDisplayer, который принимает оружие и человека (newables) как параметры метода, а не как зависимости. Взгляните на эту статью: cuttingedge.it/blogs/steven /pivot/entry.php?id=99 - person Yacoub Massad   schedule 12.01.2017