【问题标题】:Java - data structure to contain a set of different subclasses of the same superclassJava - 包含同一超类的一组不同子类的数据结构
【发布时间】:2012-10-24 18:32:09
【问题描述】:

我需要某种可以包含同一个超类的异构子类的数据结构,所有这些都是我自己实现的。

到目前为止,我正在尝试拥有一个ArrayList<SuperClass> list = new ArrayList<SuperClass>(); 然后,我假设我将能够将列表的每个插槽转换为任何一个子类,但这并不是那么好。

我需要一种有效的方法来完成上述工作。

谢谢!

【问题讨论】:

  • 嗯。究竟是什么不工作?
  • @BheshGurung 实际上应该是 Collection 而不是 List

标签: java class data-structures superclass


【解决方案1】:

您可以使用任何存在的数据结构来实现,我建议使用ListSet。例如:

Collection<Super> supers = new ArrayList<Super>();  

现在当你这样说时:

我假设我将能够将列表的每个插槽转换为 子类,

这是一个无效的假设。该集合将包含任何扩展 Super 的对象,但是您不能随意将每个元素转换为您想要的任何内容。如果您正在寻找这种类型的功能,则需要对每个元素进行instanceof 测试,示例如下:

for(Super currentSuper : supers)  
{  
    if(currentSuper instanceof SubA)  
    {  
         SubA subA = (Suba) currentSuper);  
         // do stuff with subA
    }  
    else if(currentSuper instanceof SubB)  
    {  
         SubB subB = (SubB) currentSuper);  
         // do stuff with subB
    } 
}  

视需要而定。

现在说到弗拉德:

更好的设计不是测试实际的类是什么, 但只是调用一个虚拟方法,它将在 任何情况

如果您可以保证所有潜在子类的功能,并且对覆盖您的类的人没有任何问题(如果您没有将它们标记为 final),则您不需要进行测试实例。相反,您的代码可以很简单:

for(Super currentSuper : supers)  
{  
    currentSuper.doSomethingNifty();
}  

【讨论】:

  • ...更好的设计不是测试实际的类是什么,而只是调用一个虚拟方法,无论如何它都会做正确的事情。
  • @Vlad 你的意思是像在C# 中可以声明一个函数virtual 还是有什么不同?
  • 是的。顺便说一句,与 C# 相比,Java 中的方法默认是虚拟的。
  • @Woot4Moo 显然弗拉德不得不在这上面多说几句,但他的暗示本质上是对应该被问到的问题的答案。除了提到的安全原因(在这种情况下,不包括任何子类的设计会更好)外,应避免显式强制转换。
猜你喜欢
  • 2013-08-29
  • 2013-04-06
  • 2015-10-22
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2017-02-13
  • 2013-05-20
相关资源
最近更新 更多