将子类转换为父类似乎将对象保留为子类

Casting a child class to a parent class seems to keep the object as the child class

提问人:user3844416 提问时间:10/31/2023 更新时间:10/31/2023 访问量:43

问:

我有两个类,Parent 和 Child。 实例 myParent 和 myChild

Child 的属性比 Parent 多一些。我需要通过将子实例强制转换为父类来从子实例中删除这些额外的属性。

我正在使用 ShallowCopy 方法将 myChild 实例的状态复制到 myParent 实例中。

当我投的时候

myParent = new Parent();
myParent=((Parent)myChild).ShallowCopy();

然后

Debug.Print($"The myParent class is class'{myParent.GetType()}'");

我发现myParent类实际上是一个Child类!我不明白为什么。如果有人能解释原因,我将不胜感激。谢谢!

C# 强制转换

评论

1赞 Wyck 10/31/2023
强制转换不会更改基础对象的类型,它只是更改代码中对对象的处理方式。我假设你已经把它设置好了?我还假设实际上正在这样做,这将创建一个具有相同成员的相同类型的实例(myChild)。class Child : ParentShallowCopyObject.MemberwiseClone
1赞 Michael Liu 10/31/2023
可以向 Parent 类添加一个复制构造函数,该构造函数接受 Parent 参数并复制其所有属性。然后,您可以使用myParent = new Parent(myChild);
1赞 jmcilhinney 10/31/2023
假设您是以英语为母语的人,您应该听说过“以不同的眼光投射某些东西”这句话。这句话的意思是以不同的方式看待同一件事。这就是在编程中投射某些东西的意义:你通过不同类型的引用来查看同一个对象。强制转换不仅不会改变对象的类型,而且根本不会改变对象,也就是说,它仍然是同一个对象。如果它是同一个对象,它的类型怎么可能改变?
1赞 jmcilhinney 10/31/2023
您几乎总是可以将 OOP 场景与真实世界的对象示例相关联。假设你有一只宠物猫,你需要带它去看兽医。您的宠物是猫型。你把它放在一个笼子里,然后把它带到兽医那里。他们不知道你的背带里除了动物之外有什么。他们知道你有一只宠物。当您打开笼子并取出您的宠物时,他们会看到它是一只猫。他们现在知道你是一只猫。您有一个 Cat 引用,将其强制转换为 Animal 类型,然后将其强制转换为 Cat 类型。实际的猫在任何时候都变了吗?
1赞 user3844416 10/31/2023
@Wyck - 是 class 子项:父级。而且您也是正确的,它使用 MemberwiseeClone。啊,我以为它改变了底层对象类型。看来我需要做点别的事情。

答: 暂无答案