-2

我有一个名为 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

我怎样才能做到这一点?你推荐我什么讲座来解决这个问题?

我不得不编辑问题,以便更容易理解......对此感到抱歉。

4

1 回答 1

1

由于 Java 语言在继承方面的限制(您不能从多个类继承),您将不得不编写一些管道。

由于您有一个AnimalSetFoo的类,因此您必须为这些类中的每一个创建一个接口。

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

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

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

因此,如果 Set 具有“ size ”方法,您将执行以下操作:

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

如果您想节省一些管道,您可以从Set<Animal>Foo<Animal>Animal类之一继承以避免实现此类的方法。

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

于 2013-06-08T23:20:18.457 回答