为什么要关心对象引用是接口还是类?

Mar*_*ade 9 language-agnostic oop

我似乎经常讨论是否对接口类型名称应用某种前缀/后缀约定,通常在名称的开头添加"I".

我个人在营地里主张没有前缀,但这不是这个问题的意思.相反,这是我在讨论中经常听到的一个论点:

您无法再一目了然地看到某个东西是界面还是类.

我脑子里突然出现的问题是:除了创建对象之外,为什么还要关心对象引用是类还是接口?

我已经将这个问题标记为语言不可知,但正如已经指出的那样,它可能不是.我认为这是因为虽然特定的语言实现细节可能很有趣,但我希望将其保持在概念层面.换句话说,我认为,从概念上讲,你永远不必关心对象引用是否被类型化为类或接口,但我不确定,因此问题.

这不是关于IDE的讨论,以及它们在可视化不同类型时做或不做的事情; 在浏览代码(包/源/任何形式)时,关心对象的类型当然是必需的.也不是关于命名约定的利弊的讨论.我似乎无法弄清楚在什么情况下,除了创建对象之外,你实际上关心的是否是你引用的具体类型或接口.

Phi*_*ore 10

大多数时候,你可能不在乎.但是在某些情况下,我可以想到你会在哪里.有几种,它的语言略有不同.有些语言并不像其他语言那样介意.

在控制反转的情况下(有人给你一个参数)你可能不关心它是一个接口还是一个对象,只要调用它的方法等.但是当处理类型时,它肯定会有所作为.

  • 在.NET语言等托管语言中,接口通常只能继承一个接口,而一个类可以继承一个类但实现许多接口.类和接口的顺序在类或接口声明中也很重要.因此,您需要知道在定义新类或接口时哪个是哪个.

  • 在Delphi/VCL中,接口被引用计数并自动收集,而类必须被显式释放,因此整体生命周期管理受到影响,而不仅仅是创建.

  • 接口可能不是类引用的可行来源.

  • 接口可以转换为兼容的接口,但在许多语言中,它们不能转换为兼容的类.可以将类强制转换为.

  • 接口可以传递给IID类型或IUnknown的参数,而类不能(没有强制转换和支持接口).

  • 接口的实现是未知的.它的输入和输出已定义,但创建输出的实现是抽象的.一般来说,一种态度可能是在与班级一起工作时,人们可能知道班级是如何运作的.但是在使用界面时,不应该做出这样的假设.在一个完美的世界里,它可能没有任何区别.但实际上,这肯定会影响您的设计.