У меня есть базовый класс:
public abstract class StuffBase
{
public abstract void DoSomething();
}
и два производных класса
public class Stuff1 : StuffBase
{
public void DoSomething()
{
Console.WriteLine("Stuff 1 did something cool!");
}
public Stuff1()
{
Console.WriteLine("New stuff 1 reporting for duty!");
}
}
public class Stuff2 : StuffBase
{
public void DoSomething()
{
Console.WriteLine("Stuff 2 did something cool!");
}
public Stuff1()
{
Console.WriteLine("New stuff 2 reporting for duty!");
}
}
Хорошо, теперь скажите, что у меня есть список предметов:
var items = new List<StuffBase>();
items.Add(new Stuff1());
items.Add(new Stuff2());
и я хочу, чтобы все они вызывали свой метод DoSomething (). Я мог бы ожидать итерации списка и вызова их метода DoSomething (), поэтому предположим, что у меня есть метод для этого, который называется AllDoSomething (), который просто выполняет итерацию по списку и выполняет работу:
public static void AllDoSomething(List<StuffBase> items)
{
items.ForEach(i => i.DoSomething());
}
В чем практическая разница следующего метода?
public static void AllDoSomething<T>(List<T> items) where T: StuffBase
{
items.ForEach(i => i.DoSomething());
}
Оба метода в реальном выражении, хотя и синтаксически разные, делают одно и то же.
Это просто разные способы сделать одно и то же? Я понимаю обобщения и ограничения типов, но не понимаю, почему в этом случае я бы использовал один способ вместо другого.