Задать вопрос
@antonghdi3

Zenject зачем добавлять к SceneLoader наследование от ISceneLoader?

Zenject зачем добавлять к SceneLoader наследование от ISceneLoader, чтобы потом указывать ISceneLoader как тип, хотя если указать просто SceneLoader как тип ничего не изменится и это только ради того, чтобы зависило от интерфейсов или абстракций?
using UnityEngine.SceneManagement;

public interface ISceneLoader 
{
  void ReloadCurrentScene();
  void LoadMenuScene();
  void LoadPvpArenaScene();
}

public class SceneLoader : ISceneLoader 
{
  public void ReloadCurrentScene()
  {
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
  }

  public void LoadMenuScene()
  {
    SceneManager.LoadScene("Menu");
  }

  public void LoadPvpArenaScene()
  {
    SceneManager.LoadScene("PvpArena");
  }
}


using Zenject;

public class GlobalInstaller : MonoInstaller
{
  public override void InstallBindings()
  {
    Container.BindInterfacesAndSelfTo<SceneLoader>().AsSingle();
  }
}


  private ISceneLoader _sceneLoader;

  [Inject]
  public void Construct(ISceneLoader sceneLoader)
  {
    _sceneLoader = sceneLoader;
  }
  • Вопрос задан
  • 26 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Затем, что интерфейс реализует какой-то определённый функционал. Если класс не реализует интерфейс - то и использовать функционал интерфейса не получится.

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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы