向下转换对象不会改变对象本身吗?

时间:2018-12-04 14:36:06

标签: c# design-patterns casting

所以我遇到了一些代码

IFirst x  { get; private set; }
...
x = GetItem();

if (x == null) return;

ISecond y = x as ISecond;  // this is the line I have issue with

GetItem

中定义
public IFirst GetItem() {
  //abridge
  return new ConcreteA();
}

ConcreteA定义为

class ConcreteA : IFirst, ISecond {

}

让我感到困惑的部分是当我向下转换项目并从函数返回它时,项目似乎没有失去其完整的标识。这意味着如果我将ConcreateA返回为IFirst,我希望它只是一个IFirst对象。

但是从第一个块中的代码来看,即使明确定义为IFirst仍可以访问其ISecond身份,但x还是可以的,我假设是否需要访问其ConcreteA身份? / p>

这是所期望的,还是我缺少一段代码来维持某个地方的转换?

在编程或C#中专门调用的这种行为或模式是什么?

1 个答案:

答案 0 :(得分:0)

这是预期的,并且是面向对象范例的一部分,并非特定于c#。

您可以将变量视为方框。不同的对象适合不同的盒子,但它们始终是同一对象。投射只会改变盒子的形状。

在您的情况下,您垂头丧气,因此您将ConcreteA放在一个更受限制的框中(在此类情况下)。