c#中不同类型实例化的区别

Noo*_*ude 4 .net c#

我想知道这两个实例化之间的区别

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();

    他们都按预期工作并给出结果.这两个如何不同以及何时使用哪个?

Him*_*ere 7

不同之处在于,在使用接口的第二个接口上,您只能访问特定接口上存在的那些成员而不是整个类.这允许您在实际类上实现几个不同的接口,而用户只能访问特定的"对手".

此外,界面驱动设计非常适合单元测试,因为您可以简单地将一个类交换为另一个类.

想象一下,你有另一个类也实现了你的界面.如果您在任何上下文中创建的方法都希望您将实际的类作为参数,那么您现在必须更改该方法的签名,以便还允许您的第二个类的实例.如果该方法是为接口而设计的,那么您可以将 - TestClass和- AnotherTestClass实例同时传递给它,而无需考虑实际的类型.这减少了类耦合,因为您不再依赖于实际类,而只依赖于接口定义的成员.如何实现这些成员对您的消费代码没有任何意义.

铸造时也要小心.虽然你可以说每个实例TestClass也都实现了ITest不是所有ITest类型的实例TestClass.因此,以下内容InvalidCastException在运行时生成:

ITest t = new TesClass();
AnotherTestClass t2 = (AnotherTestClass) t;
Run Code Online (Sandbox Code Playgroud)

总而言之接口只是说什么是接口的实例可以做,但不是如何它成功完成了,因为这应该是不重要的任何消费代码.留在你的例子:你Program不需额外需要知道如何TotalMarks实际上只要它知道方法确实存在,并返回它应该返回来实现.实现细节没有意义Program.这就是所谓的失败类耦合.