Подтвердить что ты не робот

С# Как использовать интерфейсы

Это относительно прямой вопрос. Но мне было интересно, как правильно использовать доступ к методу внутри отдельного проекта с помощью интерфейса.

Проект: Test.ClassLibrary

Интерфейс

public interface ITest
{
    string TestMethod();
}

Класс:

public class Test : ITest
{
    public string TestMethod()
    {
        return "Test";
    }
}

Проект: Test.Web

контроллер

public class HomeController : Controller
{
    private ITest test;
    public ActionResult Index()
    {
        return Content(test.TestMethod());
    }

}

Приведенное выше возвращает NullReferenceException. Я предполагаю это, потому что контроллер добирается до интерфейса и не знает, куда идти дальше.

Какой лучший способ исправить это? Должен ли я ссылаться на класс Test в контроллере или могу ли я каким-то образом уйти, имея только ссылку на ITest?

4b9b3361

Ответ 1

  • Вы никогда не создаете экземпляр ITest test, вы только объявляете его.
  • Ваш класс Test не наследуется от интерфейса.

Вам нужно обновить объявление класса

public class Test : ITest // interface inheritance 
{

И в вашем контроллере создайте экземпляр Test.

ITest test = new Test();

По мере того, как вы продвигаетесь дальше, вам нужно изучить методы ввода экземпляра Test в контроллер, чтобы у вас не было жесткой зависимости от него, а просто на интерфейсе ITest. В комментарии упоминается IoC или Inversion of Control, но вы должны изучить различные методы техники инверсии зависимостей (IoC является одним из них, инъекцией зависимостей и т.д.).

Ответ 2

Класс должен читать:

public class Test : ITest

в объявлении.

Ответ 3

Во-первых, вам нужно, чтобы ваш класс Test наследовал/реализовал ITest.

class Test : ITest
{
    public string TestMethod() { return "test"; }
}

Затем в классе контроллера вам нужно инициализировать Test - напрямую или в конструкторе.

public class HomeController : Controller
{
    public ITest test = new Test();
    public ActionResult Index()
    {
        return Content(test.TestMethod());
    }
}

Хотя во многих случаях вам нужно создать ITest вне конструктора и передать его или что-то еще.

Ответ 4

Интерфейсы используются для принудительной реализации свойств и методов в классе. Вы никогда не сможете создать экземпляр, потому что они исключит вам исключения.

Вы можете использовать этот код

public interface ITest
{
    string TestMethod();
}

public class Test :ITest
{
    public Test()
    {
       //do something here
    }
    public string TestMethod()
    {
        return "Test";
    }
}


public class HomeController : Controller
{
    private Test test = new Test();
    public ActionResult Index()
    {
        return Content(test.TestMethod());
    }

}