【问题标题】:How to derive (extend) recursive connected classes (trees)如何派生(扩展)递归连接类(树)
【发布时间】:2012-07-28 06:45:35
【问题描述】:

为了显示项目树,我编写了引用自身的类:

CTree
{
    String name;
    CGroupOfItems[] groups

    CGroupOfItems[] getGroups();
    //... and more getter and setter methods
}

CGroupOfItems
{
    String name;
    CItem[] items;

    CItems[] getItems();
    //... and more getter and setter methods
}


CItem
{
    String name;
    CItem[] childItems;

    CItems[] getChildItems();
    //... and more getter and setter methods
}

这样我管理树:

tree
 -group 1
   - item 1.1
     - item 1.1.1
       - item 1.1.1.1
     - item 1.1.2
   - item 1.2
 - group 2
  - item 2.1
.....

现在对于一些其他功能,我想管理其成员提供更多数据的树:

CTreeBig
{
    String name;
    int id;
    String additionalData;
    CGroupOfItemsBig[] groups

    CGroupOfItemsBig[] getGroups();
    //... and more getter and setter methods
}


CGroupOfItemsBig
{
    String name;
    int id;
    String additionalData;
    CItemBig[] items;

    CItemBig[] getItems();
    //... and more getter and setter methods
}


CItemBig
{
    String name;
    int id;
    String additionalData;
    CItemBig[] childItems;

    CItemBig[] getChildItems();
    //... and more getter and setter methods
}

现在我想从 CTree 扩展 CTreeBig。 但这是不可能的,因为我无法覆盖

CGroupOfItems[] getGroups();

与:

CGroupOfItemsBig[] getGroups();

谁能给我一个提示,我可以如何使用 Java 扩展来解决这个问题。 至少是从 Object CTreeBig 获取 Object CTree 所必需的。

当然我可以手动编写代码,但实际上我的类更复杂,我不仅有两个类 CT​​ree,而且可能有 4 个或 5 个......

提前致谢

吉奥

【问题讨论】:

    标签: java derived-class


    【解决方案1】:

    您误用或误解了继承和多态性。无需重写 CGroupOfItems[] getGroups()。您只需以适合 CGroupOfItemsBig 的方式实现它,但返回类型是 CGroupOfItems,因为 CGroupOfItemsBig“是”CGroupOfItems。但我怀疑在这里理解语言存在更深层次的问题。也许这会有所帮助:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

    【讨论】:

    • 感谢您的回复。你描述了我迄今为止的做法,并且我想改变。我将这些结构用于某些功能的 API。我希望用户能够理解一个函数将返回 CTree,而另一个函数将返回 CTreeBig。如果我按照您的建议进行操作,用户将始终假设检索最大的结构,其值将无效。
    • 也许我理解错了,但似乎没有 CTreeBig 可重用的 CTree 代码。继承似乎没有多大意义。
    • 例如:我有一个API有两个功能:
    • 例如:我有一个API有两个功能:public void fct1(CTree smallT);公共无效 fct2(CTreeBig bigT); CTree 是 CTreeBig 的一部分。出于这个原因,我可以将 CTreeBig 用于这两个功能。但是应该提醒我的函数的调用者,在 fct1 中只使用了 CTreeBig-data 的一小部分。 ==> 我想要一个大的和一个小的结构。另一方面,fct1 (smallT) 的参数是 fct2 的结果。用户应该能够从 bigT 检索 smallT,然后设置一些单独的值......在这里我认为通过继承来做到这一点会很棒:CBigTree extends CTree
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2014-07-12
    • 2014-05-06
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多