【问题标题】:Understanding interface implementation within a program? [duplicate]了解程序中的接口实现? [复制]
【发布时间】:2015-07-18 22:45:08
【问题描述】:

我试图了解这行代码发生了什么。它看起来像这样:

var adapter = (IObjectContextAdapter) db

其中db 是实体框架内的数据库上下文。

首先,为什么界面上有括号?如果我把它们取下来,我会遇到编译错误,这告诉我有某种类型的语义在起作用,而那些括号告诉计算机做某事。

我假设 db 正在实现接口,对吗?如果是这样,他们为什么要编写这样的代码?

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

首先,为什么界面上有括号?

db 是一个对象(从你的帖子来看,我们不能说db 的类型是什么)。使用括号将这个对象转换为一个实现这个接口的对象,IObjectContextAdapter

我假设 db 正在实现接口,对吗?

这是正确的。

【讨论】:

  • 但我不明白,我们为什么要这样输入?如果这个变量 db 已经实现了接口,我们为什么要这样做?
  • 您能告诉我们adapter 这个变量在哪里使用吗?
  • @Aldmeri 如果变量db 已经实现了IObjectContextAdapter,则您实际上不需要强制转换它。也许程序员希望adapter 成为IObjectContextAdapter 类型的特定引用,并且不知道他们可以将var 更改为IObjectContextAdapter 并且分配会起作用。或者他们只是没有喝足够的咖啡。我不知道。
【解决方案2】:

括号是 C# 显式转换运算符,因此它们本身与接口没有具体关系。

您将使用强制转换到特定接口(如示例中)的原因之一是您不知道给定对象的类型,但您知道它实现了给定接口.当您调用您无法控制的代码时,就会发生这种情况。

接口充当您、用户和实现对象类的人之间的“契约”。可以保证该对象会实现指定的接口,然后就可以在该对象上调用该接口定义的方法和属性。

希望这会有所帮助。

编辑:

他们使用强制转换的另一个原因是,如果类/对象实现了多个接口,并且他们希望确保将调用 IObjectContextAdapter 方法。这被称为Explicit Interface Implementation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2018-05-24
    • 2012-04-27
    • 2012-04-03
    • 2020-04-03
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多