java - 构造函数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
解决方案
好的,首先让我解决您的具体错误。为了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 风味,并品尝感觉。
推荐阅读
- scala - 从 Spark Scala 中的旧数据框中获取列名
- c# - GUIText 替换?
- caching - Hazelcast 在所有节点上持久化和加载数据
- php - Symfony 内核没有从 Symlinked 作曲家包中找到命名空间
- plaintext - 如何将tinymce初始化为纯文本编辑器
- javascript - 如何从 db laravel 6 将活动类添加到菜单
- c# - 从代码中选择网格控件中的一行
- java - EntityNotFoundException: 找不到 id
- r - 更新现有目录和表官员 r
- testing - Akka Cluster Sharding - 如何测试