从一组通用类中创建特定(或继承)的通用类集

时间:2013-06-08 22:56:41

标签: java oop generics polymorphism

我有一个名为Foo的类,这个类存储一个通用变量。我有另一个名为Set的类。 Set是一组Foo对象,因此,Set也是一个泛型类。每个类都有很多属性和实现的方法,这些方法可以处理任何类型。

class Foo<T>{
    private T var;

    public void show(){ (...) }
    (...)
}

class Set<T>{
    private Foo<T>[] things;

    public void showAllElements(){ (...) }
    public int quantityOfElements(){ (...) }
    (...)
}

这样我就可以创建一组整数,字符串,双打和任何类型。

但是我有一个抽象类,我也想用它作为Foo和Set类的模板,让我们把它称为Animal类。

abstract class Animal{
    private String voice;
    public void talk(){ (...) }
}

我想做一组动物,像这样:

class FooAnimal<T extends Animal>{
    private T var;

    public void show(){ (...) }
    public void talk(){
        var.talk();
    }
}

class SetOfAnimals<T extends Animal>{
    private FooAnimal<T>[] things;

    public void showAllElements(){ (...) }
    public int quantityOfElements(){ (...) }
    public void makeAllTheAnimalsTalk(){
        for(int i=0; i<things.lenght(); i++)
            things[i].talk();
    }
}

如何在不必将我为Foo和Set制作的代码复制并粘贴到SetOfAnimals和FooAnimal类中的情况下执行此操作?

有一个UML图表的链接来解释这个问题:

http://i.imgur.com/r3yE37Y.png?1

我该怎么做?你建议我什么讲座来解决这个问题?

我必须编辑问题,以便更容易理解......抱歉。

1 个答案:

答案 0 :(得分:1)

由于Java语言在继承方面的局限性(你不能从多个类继承),你必须编写一些管道。

由于你有一个动物的类,一个 Set 和一个 Foo ,你必须为每一个创建一个接口。这些课程。

然后你创建一个实现所有的新类:

class FooSetAnimal implements ISet<Animal>, IFoo<Animal>, IAnimal

然后在这个类中你可以拥有所有其他类的实例并转发方法调用,这是管道部分。

因此,如果一个Set有一个“ size ”方法,那么你可以这样做:

class FooSetAnimal implements ...
{
    Set set;
    public int size()
    {
        return set.size();
    }
}

如果您想保存一些管道,您可以从 Set&lt; Animal&gt; Foo&lt; Animal&gt; Animal 类之一继承避免实现这个类的方法。

无论如何没有更多信息,这个设计看起来有点笨拙......