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
?
- 你从来没有实例化
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
,并有方法绘制Circle
和Triangle
但有具体的执行将是一个坏主意,因为明天你可能会决定有两个以上的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();
}
}
使用场景第二天
如果你被要求添加Square
和Rectangle
到它,你所要做的就是在class Square: IShapes
和Main
中创建它的实现添加到列表shapes.Add(new Square());