Затем, что интерфейс реализует какой-то определённый функционал. Если класс не реализует интерфейс - то и использовать функционал интерфейса не получится.
Zenject зачем добавлять к SceneLoader наследование от ISceneLoader
Для реализации данного интерфейса, чтобы который потом кто-то мог использовать.
чтобы потом указывать ISceneLoader как тип
Нет, чтобы работать конкретно с функционалом данного интерфейса.
хотя если указать просто SceneLoader как тип ничего не изменится
Изменится: данный интерфейс будет недоступен. Да, можно объявить одноименные функции, поля и свойства, но интерфейсом это уже не будет. И, соответственно, те, кому нужен будет именно этот интерфейс не сможет его использовать, т.к. класс не реализует данный интерфейс.
Например, у вас может быть группа разных класса реализующих определённый интерфейс. И вам надо что-то сделать с несколькими экземплярами этих нескольких классов. Можно для каждого сделать по переменной и отдельно для каждого сделать нужную операцию. А можно сделать список интерфейсов и спокойно работать с объектами через интерфейс. Аналогично и для всех других применений. Интерфейс - это прежде всего соглашение о реализации какого-то определённого функционала и его использование.
Пример кодаpublic interface IFoo
{
public string Name { get; set; }
}
public class Bar1(string name) : IFoo
{
public string Name { get; set; } = name;
}
public class Bar2(string name) : IFoo
{
public string Name { get; set; } = name;
}
List<IFoo> list = [
new Bar1("Bar 1"),
new Bar2("Bar 2")
];
foreach (IFoo foo in list)
{
Console.WriteLine(foo.Name);
}
Результат:
Bar 1
Bar 2
Вообще, рекомендую почитать литературу про ООП и интерфейсы в частности. Например:
https://metanit.com/sharp/tutorial/3.9.php