Java 向下投射vs.多场
我经常读到向下投射是一件坏事,现在我需要它,我问自己在我的例子中有什么选择: 我有一个Java 向下投射vs.多场,java,interface,downcast,Java,Interface,Downcast,我经常读到向下投射是一件坏事,现在我需要它,我问自己在我的例子中有什么选择: 我有一个接口A 实现接口A的三个类:X1、X2、X3 这些类描述相同的内容,但使用不同的“格式”和过程(简单地说),这就是为什么我必须对它们进行划分 现在我有一节课如下: 类测试{ obj; } 根据“格式”的不同,我可以选择obj=newx1()、obj=newx2()或obj=newx2() 从现在开始,在处理对象时,我必须在这个类中使用大量向下转换来访问类方法(除了a中的方法)。我看到的唯一替代方法是为每个可能的
接口A
实现接口A的三个类:X1、X2、X3
这些类描述相同的内容,但使用不同的“格式”和过程(简单地说),这就是为什么我必须对它们进行划分
现在我有一节课如下:
类测试{
obj;
}
根据“格式”的不同,我可以选择obj=newx1()、obj=newx2()或obj=newx2()
从现在开始,在处理对象时,我必须在这个类中使用大量向下转换来访问类方法(除了a中的方法)。我看到的唯一替代方法是为每个可能的类创建一个字段,其中只有一个被使用过。这看起来也很糟糕
对更好的设计有什么建议吗
谢谢你的帮助
编辑:这是我的场景(简单地说):
我的主类是特定数据的容器。其中之一是内容属性(有点像HTTP请求的主体)。内容可以是:
- 纯文本(两个单独的字符串)
- 文件(仅文件路径、md5等)->稍后将加载到输入流中
- 未知(字节)->我不能也不必知道。稍后的上下文将为我提供有关它的信息
ContainerClass.setContent(纯文本)
->BaseInterface content=newtextcontent(纯文本)
ContainerClass.setFile(文件)
->BaseInterface content=新文件内容(文件)
ContainerClass.setContent(someBytes)
->BaseInterface content=newUnknownContent(someBytes)
((TextContent)container.content).getText()
->->遗憾的是,FileContent没有可以返回的单个文本,因此我也无法实现该文本)。我可以在容器类中添加一个getContentAs..()方法,该方法将对其进行适当的强制转换,但我觉得我只是解决了基本问题:(由于数据是相同的,所以听起来您只需要一个类,而不是多个。将格式与数据分开。
Test
不应该关心obj
是X1
还是X2
-它应该只知道或关心obj
是A
!即使是Test
的事实如果存在X1
或X2
是一个设计错误。您需要调查为什么Test
需要知道这一点,以找出设计的错误之处;但是向下转换是一个迹象,表明抽象处于错误的层。例如,如果Test
根据运行时类型不断决定行为obj
那么也许访问者模式会更好。如果流程相似但有不同的实现,为什么不在接口中声明一个抽象方法,让每个类都超越这些方法呢?你能发布一些示例代码吗?可能是(非常)简化的情况下,你会沮丧吗?@Boristespider谢谢你的回答。我知道我在某个地方犯了一个设计错误,但我很难找到解决方法。我更新了我的帖子来展示我的场景。也许你对此有一些想法。谢谢!@jmw5598每种类型都有一些“独特的”它们不与其他人共享的方法。要访问它们,我需要向下转换。多个类都可以。OO编程是关于行为和数据的。关键是行为和数据存储在一个“类”中,有一个接口
暴露常见行为。这个答案几乎没有意义。