首页 > 解决方案 > 构造函数java中的抽象对象

问题描述

对于一个计算机科学项目,我有一个 Movie 类,它实现了 Comparable 与 Comedy、Action 和 MovieTrilogy 的扩展。我遇到的问题是 MovieTrilogy 在构造函数中采用了 3 个 Movie 对象。MovieTrilogy 类需要将 Movie 对象作为实例变量,这意味着我需要声明一个抽象对象。我相信我的老师想要的是用 Comedy 和 Action 对象声明 MovieTrilogy 对象,但我仍然需要将它们存储为实例变量。我该怎么做?电影构造函数以及 MovieTrilogy 类如下所示。

public class MovieTrilogy extends Movie{
   private Movie movie1;
   private Movie movie3;
   private Movie movie2;
   public MovieTrilogy(Movie Movie1, Movie Movie2, Movie Movie3){
      movie1 = Movie1;
      movie2 = Movie2;
      movie3 = Movie3;
   }

这就是电影课。

public abstract class Movie implements Comparable<Movie>{
   private int Score;
   private String Title;
   public Movie(String title, int score){
      Title = title;
      Score = score;
   }
   public int getScore(){ return Score; }
   public String getTitle(){ return Title; }
   public int compareTo(Movie movie){
      return this.compareTo(movie);
   }
   public String getGenre(){
      return null;
   }
   public String toString(){
      return Title + " with a score of "  + Score;
   }
}

下面的代码是它给我尝试编译的错误MovieTrilogy

MovieTrilogy.java:5: error: constructor Movie in class Movie cannot be applied to given types;
public MovieTrilogy(Movie Movie1, Movie Movie2, Movie Movie3){
                                                            ^
required: String,int
found:    no arguments

标签: javaabstract-class

解决方案


好的,首先让我解决您的具体错误。为了MovieTrilogy扩展Movie它必须满足您在类中强制执行Movie的构造函数。因此,为了构造 a Movie(以及因此 a MovieTrilogy),您必须通过构造函数中的超级方法提供 atitle和 a 。score

所以是这样的:

public MovieTrilogy(Movie Movie1, Movie Movie2, Movie Movie3) {

    super("Trilogy title", 0);

    movie1 = Movie1;
    movie2 = Movie2;
    movie3 = Movie3;
}

MovieTrilogy但是我想知道扩展 a是否是一个好主意Movie,因为三部曲并不真正代表特定的电影,所以不能指望电影具有相同的属性。我建议将继承作为一种编程概念进行研究,以更清楚地了解您应该如何考虑它。

从您的构造函数所采用的事实来看,您title似乎score正在尝试表示某种形式的已评级媒体,因此您可能具有这样的结构:

class RatedTitle(String title, int score);
class Movie(String title, int score) extends RatedTitle(title, score);
class MovieTrilogy(String title, int score, Movie[] movies) extends RatedTitle(title, score);

(我希望你能想出一个比 更好的名字RatedTitle


编辑

正如@JohnHenly 指出并雄辩地说,

Movie#compareTo(Movie movie)看起来有点无限。

您似乎对实现Comparable接口有误解,目前使用比较方法会导致StackOverflowException. 通过返回this.compareTo(movie),您试图调用其中compareTo定义的方法,Movie然后将尝试this.compareTo(movie)一次又一次地返回,直到 JVM 不能再接受它。

有很多文章解释了如何toCompare正确覆盖,但您可能想阅读这篇文章,因为它的标题令人惊叹:添加 Comparable 风味,并品尝感觉。


推荐阅读