4

我在 OOP 中面临一些问题,即在具有特定属性的类中继承。我仍然没有找到一个简单的解决方案,但也许我没有好的关键字。

好的,假设我有以下课程:

public class Video{  
}

public class Movie extends Video{
}

public class TVSerie extends Video{
}

Movie 和 TVSerie 都应该有一个属性,即演员列表。然而,TVSerie 和电影的演员可能略有不同,所以我创建了以下演员类:

public class Actor{
    String name;
    String role;
}

public class MovieActor extends Actor{
    double compensation;  
}

public class TVSerieActor extends Actor{
    boolean guestStar;
    int numberOfEpisodes;
}

基本上我想要的只是访问视频实例中的演员列表,但我真的不知道在哪里声明每个列表。现在,我已经为 TVSerie 和 Movie 添加了特定 Actor 的列表,但这似乎不正确,因为我必须检查我的 Video 实例的类型才能获取特定 Actor 的列表,而我只需要父 Actor .

谢谢你的帮助。

4

2 回答 2

3

通过使用有界类型参数,可以使用泛型解决此类问题:

public class Video<A extends Actor> {
    protected List<A> actors;

    public List<A> getActors() { return actors; }
}

public class Movie extends Video<MovieActor> {}

public class TVSerie extends Video<TVSerieActor> {}

这样,MoveActor如果您知道Video是 a ,您将能够使用具体 s 的列表,但如果您不知道(或关心)哪种类型Movie,您也可以使用与单纯列表相同的列表List<Actor>Video一个实例实际上是。

于 2013-08-12T14:42:26.923 回答
1

使用您现有的课程,为什么不放..

protected List<Actor> actors;

在你的视频课上?这样,每个 Movie 或 TVSeries 实例都将拥有自己的演员列表。通过使用 protected 关键字,您允许两个子类访问该变量。然后在实例化或修改列表时分配适当的actor子类。

public class Video{

     protected List<Actor> actors;

     public Video(){
          actors = new ArrayList<Actor>();
     }

     // Here you can get the actors for any instance of
     // Video or any of its subclasses
     public List<Actor> getActors(){
           return actors;
     }
}

public class Movie{

     public Movie(){

          super();

          //read movies from db etc..
          actors.add(new MovieActor());
     }
}
于 2013-08-12T14:37:28.670 回答