1

我知道接口是一种不包含数据但公开行为和属性的抽象类型,并且对象的实例是内存中存在的对象的出现或副本。

我想知道编译器/底层代码如何处理两者的差异?基于对此的回答,如果我将接口作为依赖项传递给对象而不是具体实例,为什么代码更松散耦合?DoSomething如果我调用接口中定义MyClass的方法而不是DoSomething具体实例中定义的方法,会发生什么区别MyClass

4

3 回答 3

1

我知道您说过您了解界面是什么——但考虑到您将第二个问题与第一个问题联系起来的方式,我确实想知道这是否完全正确。第二个可以在不知道第一个的情况下回答,它也不受它的任何影响。

特别是关于为什么它更松散耦合的问题与编译器的实现或任何东西无关:它只是软件架构

除了方法/属性的存在之外,接口对实现类型没有任何限制(嗯,从技术上讲,它们也是方法)。

实现甚至不必在类型本身上公开,类型也不必具有特定的构造函数等。更重要的是 - 它甚至不必是class。然后有一个(相当极端的)事情,使用接口,单一类型可以有同一个接口的多个实现。

一旦您使用基类,就可能会引入大量其他限制。

诚然,这些显然也是一件好事 - 例如,如果已知的具体基础已知是不可变的(为了一致性)并且不允许在其构造函数中使用“空值”等(都不能通过接口强制执行)。

于 2012-04-24T11:00:35.580 回答
0

您可以拥有接口或抽象类的许多实现(具体实例)。

通常,您应该定义接受具有接口的类层次结构而不是具体类的方法,以便它们是通用的,并且不必为您定义的每个新实现重写。

在基类或派生类中调用该方法应该调用相同的方法,前提是您正确地覆盖了该方法。

于 2012-04-24T10:40:13.193 回答
0

查看 MSDN 杂志文章:“深入了解 .NET Framework 内部结构以了解 CLR 如何创建运行时对象”以了解实现细节。
我认为运行时需要支持接口的主要原因尤其与不同编译时间的程序集在运行时可能相互连接的事实有关。

于 2012-04-24T10:52:35.493 回答