gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:18:29 24 4
gpt4 key购买 nike

我想知道这两个Instantiation的区别

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

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

最佳答案

不同之处在于,在第二个使用接口(interface)的方法中,您只能访问该特定接口(interface)上存在的那些成员,而不是整个类。这允许您在实际类上实现几个不同的接口(interface),而用户只能访问一个特定的“容器”。

此外,接口(interface)驱动设计有利于单元测试,因为您可以简单地将一个类与另一个类交换。

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

类型转换时也要小心。虽然您可以说 TestClass 的每个实例也实现了 ITest,但并非所有 ITest 实例都是 TestClass 类型。因此,以下代码会在运行时产生一个 InvalidCastException:

ITest t = new TesClass();
AnotherTestClass t2 = (AnotherTestClass) t;

总而言之,一个接口(interface)只说明了该接口(interface)的实例可以做什么什么,而不是如何实现它,因为这对于任何消费代码来说都不重要。继续你的例子:你的 Program 不需要知道 TotalMarks 是如何实际实现的,只要它知道该方法实际存在并返回它应该返回的内容返回。实现细节对 Program 没有任何意义。这就是所谓的类损失耦合。

关于c# - c#中不同类型实例化之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35595137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com