繁体   English   中英

将超类的对象转换为子类 - 向下转换

[英]Cast an object of super class to a sub class - down casting

我知道转换实际上只能从子类到超类(向上转换),但这个例子说明了我想做什么。

Class Super {}
Class Sub extends Super {}

Super super = new Super();
Sub sub = (Sub)super;

我相信这被称为“向下”铸造,这是不允许的......

给定Super类型的对象,创建Sub类型对象的最佳方法是什么。

编辑:

这就是问题 - 将动物转换为猫的最佳方法是什么。

答案? 从基类型动物开始,将属性复制到cat。 添加毛发和尾巴等基本上是一个复制构造函数。 这是正确的答案(或一个好的答案)?

另一个编辑:

我认为我的问题很清楚但也许它太笼统了。 要求采用“最佳”方式做某事往往会产生很多不同的反应。 我意识到在不同情况下最好的方式可能会有所不同。

我不是在寻找有关Java或OO基础知识的教程。 只是捕获意见所以我可以解决这个问题,因为我已经使用最佳实践概述了它。

CatAnimal

如果我给你一只动物(不一定是猫),你会怎么把它变成猫?

编辑:

几乎可以做任何事情。 大多数时候,你不应该。 我相信更好的设计将消除向下转型的需要。 但是你可以:

  • Super中有一个构造函数,它将Sub作为参数。

  • 实现Super的工厂并有一个以Sub为参数的方法。

我建议你扩展你的问题,告诉我们你需要什么,因为我真的认为存在一个更优雅的解决方案。

如果实际对象的类型为“Sub”,则只能向下转换。 例如:

Super subAsSuper = new Sub();
Sub sub = (Sub)subAsSuper

你的方式不会起作用,因为super不是sub的子类。 所以你会得到运行时错误。

您可以向Sub类添加构造函数,该类将Super对象作为参数。

编辑:从你的问题来看,你知道什么和你不知道什么都不清楚。 因此,当人们回答时,不要感到惊讶

我认为这被称为“向下”铸造,这是不允许的

部分而不是(非常模糊)的“实际问题”。

是的,复制构造函数就是这样。

不,它不是唯一的,工厂方法会做得很好。

不,这不是最好的 - 我们不知道你有什么约束和假设。


旧版本:可以通过任何一种方式进行转换,通常不需要向上转换(除非您需要选择特定的重载方法)。

除了创建一个基于来自给定数据的数据构造新对象的方法之外,通常无法创建Sub类型的对象给定Super类型的对象

为了进行强制转换,您必须确保您正在投射的对象实际上是您投射到的类型(或其子类型)。

记住这个想法 -

Class Super {}
Class Sub {
    public Super super = new Super();
}

Sub sub = new Sub();
sub.super = super;

我在这里做了一个非常基本的例子,但你可以随心所欲地去任何你想要的地方,你可以让它像继承一样工作。 并且它不会返回任何错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM