我想知道这两个实例化之间的区别
interface ITest
{
int TotalMarks(int englishMarks, int mathematicsMarks);
}
class TestClass : ITest
{
public int TotalMarks(int engMarks, int mathMarks)
{
return engMarks + mathMarks;
}
}
class Program
{
static void Main(string[] args)
{
TestClass c = new TestClass();
Console.Write(c.TotalMarks(10, 20));
Console.Write("\n");
ITest c1 = new TestClass();
Console.Write(c1.TotalMarks(21, 34));
Console.ReadKey();
}
}
TestClass c = new TestClass();
ITest c1 = new TestClass();
他们都工作,并给出预期的结果。这两个有何不同以及何时使用哪个?
区别在于使用接口的第二个接口只能访问特定接口上存在的那些成员,而不是整个类。这使您可以在实际的类上实现一些不同的接口,而用户只能访问特定的“约束器”。
此外,接口驱动的设计在单元测试中非常有用,因为您可以轻松地交换一个类。
假设您还有另一个类也实现了您的接口。如果您在任何上下文中创建的方法都希望您将实际的类用作参数,则现在必须更改该方法的签名,以同时允许第二个类的实例。如果该方法是为接口设计的,则可以将-TestClass
和AnotherTestClass
-instances都传递给该方法,而不必担心它的实际类型。这样就减少了类耦合,因为您不再依赖于实际的类,而只依赖于接口定义的成员。这些成员的实现方式对您使用的代码没有任何意义。
铸造时也要小心。尽管您可以说的每个实例TestClass
也都实现了,但ITest
并非所有的实例ITest
都是type的TestClass
。因此,以下代码会InvalidCastException
在运行时产生一个:
ITest t = new TesClass();
AnotherTestClass t2 = (AnotherTestClass) t;
总而言之接口只是说什么是接口的实例可以做,但不是如何它成功完成了,因为这应该是不重要的任何消费代码。继续举例说明:只要知道该方法确实存在并返回应该返回的内容,就Program
无需知道TotalMarks
其实际实现方式。实现细节对毫无意义Program
。这就是所谓的losly类耦合。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句