public interface IComponent {
public void play();
public void setPlaybackSpeed();
public String getName();
}
public class Playlist implements IComponent {
public String playlistName;
public ArrayList<IComponent> playlist = new ArrayList();
public Playlist(String playlistName) {
this.playlistName = playlistName;
}
public void play(){
System.out.println("Playing the song");
}
public void setPlaybackSpeed(){
System.out.println("Setting the speed of playback to the specified value");
}
public String getName(){
return this.playlistName;
}
public void add(IComponent component){
}
public void remove(IComponent component){
}
}
i am able to understand in the line
public ArrayList<IComponent> playlist = new ArrayList();
当我们在泛型中传递任何类时,它只允许传递该类型数据的对象。当我们传递interface时会发生什么,代码会发生什么。
必须传递一个实例来实现接口中调用的方法。
这就是接口和泛型的美妙之处:您可以通过更改实现类来以良好定义的方式更改行为。
我想说你的类命名有很多需要改进的地方。我会选择Song
/IComponent
。后者对我的口味来说太普通了。
您没有显示IComponent
接口,但如果它包含play
方法对我来说是有意义的。这种设计允许用户播放单个歌曲或整个播放列表。它被称为复合模式。
你的方法还有很多工作要做。您应该能够轻松地实现play
,add
和remove
。
实际上是将功能和属性混合在一起。这里的播放列表实际上是一个容器,它应该包含可播放的项目,而不是播放它们的能力。
创建播放列表泛型:
public T class Playlist<T> {
public String playlistName;
public ArrayList<T> playlist = new ArrayList();
... // SOME METHODS
}
IComponent
类的实际实现:
public class IComponentImpl implements IComponent {
public void play(){
System.out.println("Playing the song");
}
public void setPlaybackSpeed(){
System.out.println("Setting the speed of playback to the specified value");
}
...// other methods related to playable objects.
}
现在你可以使用
IComponent song1 = new IComponentImpl();
IComponent song2 = new IComponentImpl();
PlayList<IComponent> playlist = new PlayList<>();
playlist.add(song1);
playlist.add(song2);
// which return a song
playlist.get(at_position).play();
这样就可以同时使用泛型和接口了。