某个容器类包含基类“Table”的对象列表(如WoodenTable,MetalTable ...)。每个Table类都保留其MaterialType(MaterialType.Wood,MaterialType.Metal ...)。问题是如何为容器类提供适当的getter方法,该方法可以返回Table的每个SubClass。
到目前为止,我发现了以下几种方法:
1.以材料类型作为参数。如果T的类型与materialType不对应,则此处的危险是ClassCastException:
<T extends Table> T getTable(MaterialType materialtype)
WoodenTable table = getTable(MaterialType.Wood);
MetalTable table = getTable(MaterialType.Wood); // ups... exception
2.Getter with Class参数。安全但对用户不太清楚(与MaterialType作为参数比较):
<T extends Table> T getTable(Class<T> tableClass)
WoodenTable table = getTable(WoodenTable.class);
3.每个表子类的获取。使用,编写和添加新的Table子类很麻烦:
WoodenTable getWoodenTable()
WoodenTable table = getWoodenTable();
4.Getter for Table界面。如有必要,在容器类之外完成转换。
Table getTable(MaterialType materialType)
WoodenTable woodenTable = (WoodenTable)getTable(MaterialType.Wood)
还有其他(更好)的方法吗?如果没有,那么哪一个最适合或最不臭?
答案 0 :(得分:0)
应该就是这么简单:
public Table getTable()
{
return this.table;
}
这将返回一个Table
对象,由调用者根据需要进行操作。与以下块类似:
public Collection<String> getCollection()
{
return new ArrayList<String>();
}
正文返回ArrayList
但该函数确实返回Collection
。使用对象之间最常见接口的定义良好的API将为您提供同样的灵活性。
编辑
是的,这可能是一个用例,但我经常需要一些东西 like:for(表t:TableContainer){ (SubClassA)t.doSomethingSpecificForA();}这就是我的问题 开始。
让我们假设以下接口和实现:
public interface Table
{
Table getTable();
void doSpecial();
}
public class WoddenTable implements Table
{
...
public Table getTable()
{
return this;
}
public void doSpecial()
{
mySpecial();
}
private void mySpecial()
{
System.out.println("Wooden");
}
}
public class MetalTable implements Table
{
...
public Table getTable()
{
return this;
}
public void doSpecial()
{
mySpecial();
}
private void mySpecial()
{
System.out.println("Metal");
}
}
和以下代码:
public static void main(String[] args)
{
Collection<Table> tables = new ArrayList<Table>();
tables.add(new WoodenTable());
tables.add(new MetalTable());
for(Table table : tables)
{
table.doSpecial();
}
}
这里的方法是共享公共API。并且每个类的内部都没有暴露,因此需要为每个类做一些事情special
隐藏在公共接口后面。这可以防止必须执行检查或任何其他混乱方法来解决此类问题。
答案 1 :(得分:0)
我建议不再考虑表格与属性(材料)的数据结构,并开始将它们视为“人”(Object Thinking)。不要从中获得“材料”。相反,让他们揭露他们的行为。
当您更改表格的设计时,您将自动更改其容器的设计。显而易见的是,容器不应该关心桌子的材料,但应该让他们控制他们是想要离开容器还是留在那里。