Я сделал следующий пример кода, чтобы узнать, как использовать сигнатуру обобщенного метода.
Чтобы получить метод Display () как для клиента, так и для сотрудника, я фактически начал заменять мой интерфейс IPerson на абстрактный класс пользователя .
Но потом я остановился, вспомнив подкаст, в котором дядя Боб рассказывал Скотту Хансельману о Принципе единой ответственности , в котором у вас должно быть много маленьких классов, каждый из которых выполняет одну конкретную вещь, то есть класс Customer не должен иметь Print () и Save () и CalculateSalary () , но у вас должен быть класс CustomerPrinter и Класс CustomerSaver и Класс CustomerSalaryCalculator .
Это кажется странным способом программирования. Однако избавление от моего интерфейса также показалось неправильным (так как многие контейнеры IoC и примеры DI используют их по своей природе), поэтому я решил попробовать Принцип единой ответственности.
Итак, следующий код отличается от того, что я программировал в прошлом (я бы создал абстрактный класс с методом Display () и избавился бы от интерфейса), но основываясь на том, что я слышал о разделении и ТВЕРДОМ принципы, это новый способ кодирования (интерфейс и класс PersonDisplayer) Я думаю, что это правильный путь .
Я бы хотел бы услышать, если другие думают так же по этому вопросу или испытали положительные или отрицательные последствия этого (например, громоздкое количество классов, каждый из которых выполняет определенную вещь, и т. Д.).
using System;
namespace TestGeneric33
{
class Program
{
static void Main(string[] args)
{
Container container = new Container();
Customer customer1 = container.InstantiateType<Customer>("Jim", "Smith");
Employee employee1 = container.InstantiateType<Employee>("Joe", "Thompson");
Console.WriteLine(PersonDisplayer.SimpleDisplay(customer1));
Console.WriteLine(PersonDisplayer.SimpleDisplay(employee1));
Console.ReadLine();
}
}
public class Container
{
public T InstantiateType<T>(string firstName, string lastName) where T : IPerson, new()
{
T obj = new T();
obj.FirstName = firstName;
obj.LastName = lastName;
return obj;
}
}
public interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class PersonDisplayer
{
private IPerson _person;
public PersonDisplayer(IPerson person)
{
_person = person;
}
public string SimpleDisplay()
{
return String.Format("{1}, {0}", _person.FirstName, _person.LastName);
}
public static string SimpleDisplay(IPerson person)
{
PersonDisplayer personDisplayer = new PersonDisplayer(person);
return personDisplayer.SimpleDisplay();
}
}
public class Customer : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
}
public class Employee : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int EmployeeNumber { get; set; }
}
}