我有一个名为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
我该怎么做?你建议我什么讲座来解决这个问题?
我必须编辑问题,以便更容易理解......抱歉。
答案 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 类之一继承避免实现这个类的方法。
无论如何没有更多信息,这个设计看起来有点笨拙......