C# 中不同类型的实例化之间的差异

本文关键字:之间 实例化 同类型 | 更新日期: 2023-09-27 18:35:54

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

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

    它们都按预期工作并给出结果。这两者有何不同以及何时使用哪个?

C# 中不同类型的实例化之间的差异

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

此外,接口驱动的设计在单元测试方面很好,因为您可以简单地将一个类交换到另一个类。

假设您有另一个类也实现您的接口。如果您在任何上下文中创建的方法希望实际类作为参数,则现在必须更改该方法的签名,以便也允许第二个类的实例。如果该方法是为接口设计的,则可以将 - TestClassAnotherTestClass 实例传递给它,而无需注意它的实际类型。这减少了类耦合,因为您不再依赖于实际的类,而只依赖于接口定义的成员。这些成员的实现方式对使用代码没有任何意义。

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

ITest t = new TesClass();
AnotherTestClass t2 = (AnotherTestClass) t;
总而言之,接口

只说明该接口的实例可以做什么,而不是它如何实现这一点,因为这对于任何使用的代码来说都不重要。继续使用您的示例:您的Program不需要知道TotalMarks的实际实现方式,只要它知道该方法实际存在并返回它应该返回的内容。实现细节与Program无关。这就是所谓的失败类耦合。

可能会有很多不同,但我会提到的主要差异很少

ITest c1 = new TestClass();

使用此接口创建对象允许创建实现ITest的任何类的对象,例如TestClass。

class AnotherTestClass : ITest
{
    public int TotalMarks(int engMarks, int mathMarks)
    {
        return engMarks + mathMarks;
    }
}
 ITest c1 = new AnotherTestClass();

另一方面,在TestClass中声明一些新方法并尝试使用通过接口创建c1访问它,您将无法访问它,但是如果您通过而不是接口在第一种方法中创建,则可以访问新方法,如下所示。

class TestClass : ITest
{
    public int TotalMarks(int engMarks, int mathMarks)
    {
        return engMarks + mathMarks;
    }
    public void AdditionalMethod()
    {
    }
}
TestClass c = new TestClass();
c.AdditionalMethod(); //Valid
ITest c1 = new TestClass();
c1.AdditionalMethod(); //Invalid, compilation error

接口通过作用于模式程序而不是实现来帮助我们创建松散耦合的应用程序,您可以在此处和此处阅读有关它的更多信息。