关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
5年前关闭。
Improve this question
想象以下场景。
class Shape
{
// methods of Class Shape
}
class Circle extends Shape
{
// methods of Class Shape
// methods of Class Circle
}
class Square extends Shape
{
// methods of Class Shape
// methods of Class Square
}
class Canvas // This class should a bucket of objects that belong to Square and Circle
{
// Declaring a single list of supertype
List<Shape> heterogeneousCollection;
// Declaring two separate lists
List<Cirlce> homogeneousCollection;
List<Square> homogeneousCollection;
}
对应的关系模式如下
哪个是更好的方法“声明一个父类(super class)型列表(异构集合)”或“声明两个单独的列表(两个不同的同质集合)”
我在做决定时考虑了以下几点。
考虑一种避免 N+1 问题并从单个查询中读取的方法,例如
SELECT * FROM
Canvas INNER JOIN Circle ON ..
Canvas INNER JOIN Square ON ..
Circle INNER JOIN Shape ON ..
Square INNER JOIN Shape ON ..
现在,对于 Canvas 的每一条记录,我们都以 (B+C) 行结束。但是,使用几个 ORM 工具,可以将 Circle 和 Square 中的不同数据集分组到两个单独的列表中。 (我在这里考虑iBatis)
想象一个我们计划处理 UI 函数以在对象 Canvas 中显示数据的案例。除了Circle和Square之间的共同功能外,它们中的每一个都可以具有不同的功能。例如 Square 可以有 getLengthOfSide(),而 Circle 可以有 getRadius()。如果我们使用异构列表,我们最终可能会在需要访问这些函数的每个地方都使用强制转换运算符。
Class Canvas
{
void drawAll()
{
for (Shape s : heterogeneousCollection)
{
if (s instanceof Circle)
{
s.draw(); // common function present in Shape also
s.xyz(); // specific to Circle
}
if (s instanceof Square)
{
s.draw(); // common function present in Shape also
s.abc(); // specific to Square
}
}
}
}
在两个同构列表的情况下,我们可能分别为每个列表有两个不同的 for 循环。
但是,如果我们需要添加一种新的形状(比如三角形),它会影响 Canvas,我觉得这是设计缺陷的结果,Java 可能有能力处理这个问题。请对此有所了解。任何对书籍/链接的引用都会有很大帮助。只是想告诉你们,这不是学校作业,我正在认真研究各种解决方案。请原谅我问了一个很长的问题。
PS:另一种解决方案
List<? extends Shape>
被排除,因为我们无法将任何对象插入此集合。
最佳答案
当我们有一般信息而不是具体事实时,很难给出解决方案。例如 xyz() 和 abc() 方法。它们是什么,为什么?在您的示例中,它们似乎有类似的用途,因此我会考虑在 Shape 中定义一个名为 doSomethingSpecific() 的抽象方法,以便由所有 Shape 子类实现。
现在你的代码是:
void drawAll()
{
for (Shape s : heterogeneousCollection)
{
s.draw(); // common function present in Shape also
s.doSomethingSpecific(); // specific to each implementation
}
}
如果可能,我更喜欢异构集合。我非常不喜欢
instanceof
由于您指出的原因 - 当我们添加 Triangle
时会发生什么混合。
关于java - 从单个对象继承的不同类型的集合与单个 super 对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943915/