我使用 C# 和 .NET 已经有一段时间了,尽管我之前一直使用 OOP 语言(更准确地说是 Java),但在处理 .NET 应用程序时,我发现接口(interface)使用的比我在 java 见过。我根本没有很多经验,所以我并不是说接口(interface)在 .NET 中使用得更多,但现在我觉得有必要更深入地了解接口(interface)以及人们经常使用它们的好处是什么.
我在互联网上有一些东西,在这里有一些东西,对我来说最有意义的解释是这个 - How will I know when to create an interface? .
我的问题来了。我根本不期望对接口(interface)有一些神奇的解释,因为我已经阅读了足够多的书,发现没有这样的东西。我希望随着经验和编码的深入理解会自然而然地出现,所以我决定尝试使用链接中接受的答案中的接口(interface)所指出的示例的好处。我也将其复制粘贴到这里:
你有 4 种不同类型的 a、b、c、d。在你的代码中你有这样的东西:
a.Process();
b.Process();
c.Process();
d.Process();
为什么不让他们实现IProcessable
,然后执行
List<IProcessable> list;
foreach(IProcessable p in list)
p.Process();
当您添加 50 种类型的类都做同样的事情时,这会更好地扩展。
问题是我似乎没有得到这个。阅读后,我打开 Visual Studio 2010 并尝试重新创建这样的示例 - 我创建了一个项目并创建了四个类 - a
、b
、c
,d
。所有这些类都是相同的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class a : ITest
{
public void Test()
{
System.Console.WriteLine("Hi from a");
}
}
}
只有 4 个不同的名称和打印名称的方法 Test()
。这是界面:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
interface ITest
{
public void Test();
}
}
根据我在 Program.cs
中的理解,我有这个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
List<ITest> list;
static void Main(string[] args)
{
foreach (ITest p in list)
p.Test();
}
}
}
嗯。看来我真的搞错了。我认为通过实现相同的接口(interface),我可以自动获取所有类的列表并使用它们,例如在我上面的 Main()
方法中。但是我收到以下错误:
An object reference is required for the non-static field, method, or property
好吧,有人可以降低我的水平并根据这个例子向我解释我如何通过使用接口(interface)来获得这样的好处。
最佳答案
这里的问题与接口(interface)无关,而是与Program
类有关。字段 list
是一个实例成员,而方法 Main
是静态的。正如异常(exception)所说,您不能从静态方法中引用非静态成员。
此外,list
从未实例化或初始化(至少不在您发布的代码段中)。因此,即使 list
如果声明为静态,您的代码也会产生 NullReferenceException
。
尝试将您的 Program
类更改为:
class Program
{
static List<ITest> list;
static void Main(string[] args)
{
list = new List<ITest>();
// ...
// initialize list
// ...
foreach (ITest p in list)
p.Test();
}
}
关于c# - 接口(interface)使用说明(C#视角),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15097570/