C#如何使用接口

时间:2011-10-14 01:45:22

标签: c# interface

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

项目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来解决这个问题吗?

4 个答案:

答案 0 :(得分:20)

  • 您永远不会实例化ITest test,只能声明它。
  • 您的Test类不会从界面继承。

您需要更新您的班级声明

public class Test : ITest // interface inheritance 
{

在您的控制器中,实例化test

ITest test = new Test();

随着您的进一步发展,您将需要探索将Test实例注入控制器的技术,以便您不必依赖它,而只是在接口ITest上。评论提及IoC或控制反转,但您应该研究各种依赖性反转技术技术(IoC是其中之一,依赖注入等)。

答案 1 :(得分:5)

课程需要阅读:

public class Test : ITest

在其声明中。

答案 2 :(得分:4)

首先,您需要让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并将其传递给某个东西。

答案 3 :(得分:1)

什么?

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

C#中,按惯例,接口名称是通过在前缀I之前定义的,因此,如果要使用一个名为shapes的接口,则可以将其声明为IShapes

现在为什么?

Improves code re-usability

假设您要绘制CircleTriangle. 您可以将它们组合在一起并命名为Shapes,并具有绘制CircleTriangle的方法 但是具体实施将不是一个好主意,因为明天您可能会决定再拥有2个Shapes RectangleSquare。现在,当您添加它们时,很有可能会破坏代码的其他部分。

使用接口,您可以将不同的实现与合同隔离


如何使用它们?

使用场景第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();
     }
}

使用场景第2天

如果要求您在其中添加SquareRectangle,您要做的就是在class Square: IShapes中为其创建一个标准,并在Main中添加到列表{ {1}}