实现可以在Java / JavaFX中保存多种数据类型的通用列表

时间:2014-11-18 06:14:24

标签: java list model-view-controller javafx uml

我需要开发一个包含多种库类型的列表库。例如,图书馆可以是视频库或照片库。如果这是相关的,我想使用JavaFX遵循MVC设计模式。请参阅下面的UML图表,参考我的问题:

图1

enter image description here

所以我想我会在我的库模型中使用泛型类型,如下所示:

public class LibraryModel<T> {
    private List<T> aList;
}

但是,这不起作用,因为当我实例化库列表时,我需要指定一个类型。因此,通过这种方式,我只能将照片或视频库指定为列表,而不是两者。

我尝试引入一个名为“Library”的泛型类型,它将列在要由PhotoController / VideoController扩展的列表中(作为超类):

图2 enter image description here

public class LibraryModel {
    private List<Library> aList;
}

在图2中,我可以创建一个通用库列表。但这将如何影响我执行特定照片/视频任务的能力?我们假设我有以下方法:

超类方法:

displayAll()
add()
remove()

照片库方法:

displaySlideShow()

视频库方法:

playVideo()

通过将库存储为超类,我如何能够调用其他库类型的特定方法?这甚至合法吗?

请放心,我还在学习Java,提前谢谢。

1 个答案:

答案 0 :(得分:3)

使用抽象类

图书馆。

abstract class Library {

}

然后创建子类。

照片库。

class PhotoLibrary extends Library {

     displaySlideShow(){

     }   
}

视频库。

class VideoLibrary extends Library {

        playVideo() {

        }

}

在主要课程或其他课程中,您可以使用它们。

private List<Library> aList;
aList.add(new PhotoLibrary());
VideoLibrary l2 = new VideoLibrary();
aList.add(l2);

然后你可以使用

调用可用的方法
Library l = aList(i);
if(l instanceof PhotoLibrary) {
     PhotoLibrary pl = (PhotoLibrary)l;
     pl.displaySlideShow();
}
else if(l instanceof VideoLibrary) {
     VideoLibrary vl = (VideoLibrary)l;
     vl.playVideo();
}