我想知道这两个实例化之间的区别
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();
}
}
Run Code Online (Sandbox Code Playgroud)
TestClass c = new TestClass(); ITest c1 = new TestClass();
他们都按预期工作并给出结果.这两个如何不同以及何时使用哪个?
不同之处在于,在使用接口的第二个接口上,您只能访问特定接口上存在的那些成员而不是整个类.这允许您在实际类上实现几个不同的接口,而用户只能访问特定的"对手".
此外,界面驱动设计非常适合单元测试,因为您可以简单地将一个类交换为另一个类.
想象一下,你有另一个类也实现了你的界面.如果您在任何上下文中创建的方法都希望您将实际的类作为参数,那么您现在必须更改该方法的签名,以便还允许您的第二个类的实例.如果该方法是为接口而设计的,那么您可以将 - TestClass和- AnotherTestClass实例同时传递给它,而无需考虑实际的类型.这减少了类耦合,因为您不再依赖于实际类,而只依赖于接口定义的成员.如何实现这些成员对您的消费代码没有任何意义.
铸造时也要小心.虽然你可以说每个实例TestClass也都实现了ITest不是所有ITest类型的实例TestClass.因此,以下内容InvalidCastException在运行时生成:
ITest t = new TesClass();
AnotherTestClass t2 = (AnotherTestClass) t;
Run Code Online (Sandbox Code Playgroud)
总而言之接口只是说什么是接口的实例可以做,但不是如何它成功完成了,因为这应该是不重要的任何消费代码.留在你的例子:你Program不需额外需要知道如何TotalMarks实际上只要它知道方法确实存在,并返回它应该返回来实现.实现细节没有意义Program.这就是所谓的失败类耦合.
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |