c#如何使用接口

本文关键字:接口 何使用 | 更新日期: 2023-09-27 18:11:08

这是一个相对直接的问题。但是我想知道通过使用接口在单独的项目中访问方法的正确用法是什么。

Project: 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 ?

c#如何使用接口

  • 你从来没有实例化ITest test,你只是声明它。
  • 你的Test类没有从接口继承
你需要更新你的类声明
public class Test : ITest // interface inheritance 
{

在控制器中实例化test

ITest test = new Test();

随着学习的深入,您将需要探索将Test实例注入控制器的技术,这样您就不会对它产生硬依赖,而只依赖于接口ITest。注释中提到了IoC或控制反转,但是您应该查看各种依赖反转技术(IoC是其中之一,依赖注入等)。

类需要读取:

public class Test : ITest

首先,您需要让您的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并将其传递进去。

什么?

接口基本上是一个契约,所有实现接口的类都应该遵循这个契约。它们看起来像一个类,但没有实现。

C#中,按照惯例,接口名称是通过前缀"I"来定义的,所以如果你想要一个名为形状的接口,你可以将其声明为IShapes

Improves code re-usability

假设你想画Circle, Triangle. 您可以将它们组合在一起,并将它们称为Shapes,并有方法绘制CircleTriangle但有具体的执行将是一个坏主意,因为明天你可能会决定有两个以上的Shapes Rectangle &Square。现在,当您添加它们时,很有可能会破坏代码的其他部分。

使用Interface,您可以将不同的实现与契约

隔离开来

如何使用

使用场景第1天

你被要求创建一个应用程序来绘制圆形和三角形

interface IShapes
{
   void DrawShape();
}
class Circle : IShapes
{
    
    public void DrawShape()
    {
        Console.WriteLine("Implementation to Draw a Circle");
    }
}
class Triangle : IShapes
{
    public void DrawShape()
    {
        Console.WriteLine("Implementation to draw a Triangle");
    }
}
static void Main()
{
     List <IShapes> shapes = new List<IShapes>();
     shapes.Add(new Circle());
     shapes.Add(new Triangle());
     foreach(var shape in shapes)
     {
         shape.DrawShape();
     }
}

使用场景第二天

如果你被要求添加SquareRectangle到它,你所要做的就是在class Square: IShapesMain中创建它的实现添加到列表shapes.Add(new Square());