基本面向对象编程
Posted
技术标签:
【中文标题】基本面向对象编程【英文标题】:Basic Object Oriented Programming 【发布时间】:2013-10-25 22:41:14 【问题描述】:我目前正在学习 Java,并被要求编写一个程序来处理 演员和电影作为班级。
演员类具有以下属性:Name, Address, age, myFilm
(一个数组或数组列表,用于保存特定演员的所有电影
已经出演了。
电影类有这些属性:Name, Code
(String, String)
我已经使用 getter 和 setter 方法实现了这些类来处理数据: 到目前为止我的演员班:
public class actor
private String name;
private String address;
private int age;
int[] myFilms = new int[3];
public actor (String name, String address, int age)
public void setName (String name)
this.name = name;
public void setAddress (String address)
this.address = address;
public void setAge (int age)
this.age = age;
public void setFilm ()
public String getName ()
return name;
public String getAddress ()
return address;
我的电影课:
public class film
private String name;
private String code;
//Constructor
public film ()
public void setName (String name)
this.name = name;
public String getName ()
return name;
public String getCode (String name)
//Get code:
//Split Function
String[] words = name.split("\\s+");
String code = "";
for (int i=0; i < words.length; i++)
code = code + words[i].charAt(0);
code = code.toUpperCase();
return code;
对于如何使节目动态显示每个演员的总影片,我遇到了难题。这是针对大学分配的,我还需要在某个时候对数组进行深层复制。我对 OO 几乎完全陌生,所以这对我来说是一项棘手的任务。
任何建议或正确方向的观点将不胜感激。
【问题讨论】:
为什么演员myFilms
是int
的数组?为什么不是film
的数组?
是的,电影数组 (Film[])。还有一个约定,每个类名必须以大写字母开头。
ArrayList<Film>
会更好
我会使用 List如果你有一个数据库,其中有一个包含用户名和电影(ID)等的表,你可以创建一个如下的类,
Class Film
private String actorName;
private String filmCode;
private String filmName;
....getter & setter methods
...
然后你可以创建一个方法来获取 Film 类的数据列表。 例如:
List<Film> filmList = new ArrayList<Film>();
String actorName = "Arnold";
filmList = dbCon.getFilmListByActor(actorName);
你的 getFilmListByActor 方法应该是这样的,
public List<Film> getFilmListByActor(String actorName)
List<Film> filmList = new ArrayList<Film>();
//Query for get film list by actor
//assigne filmList to result set
enter code here
return filmList;
【讨论】:
【参考方案2】:考虑将“在电影中扮演的演员”提取到另一个类,将电影与演员分离(演员也可以做剧院眼镜、配音等,而不是专门的电影。)
class ActorRole
private Actor actor;
private Movie movie;
private int dollarsSallary;
private int scenesPlayed;
// etc.
如果您不想这样做,我几乎可以肯定创建从电影到演员的依赖关系比从演员到电影更好,因为电影几乎肯定有演员:
class Movie
private List<Actor> actors = new ArrayList<Actor>();
这使得计算演员统计数据变得更加困难(您必须遍历所有电影),但我认为这是一个更好的设计。
计算单人表演:
for ( Movie movie : listOfAllMovies )
if ( movie.getActors().contains( myActor ) ) // read about equals() in Java !
timesPlayed++;
如果您想为更多演员进行排名,您可以使用Map<Actor,Integer>
将演员映射到他们的出场次数计数器。
这可能是一个冗长的操作,因此您可以考虑兑现结果(如上图) - 解决方案可以是地图、ActorStatistics 类、actor 中的简单 timesPlayed 字段等。
不要害怕反对
不要费力地将电影映射到 id(例如您的 id
,它可能与您的电影代码 String
相关联,这会增加另一个类型不兼容的问题。
尝试使用更多对象引用而不是变通方法,并使用List
而不是数组。
一般来说,阅读 Java 中的 Collections,例如 ArrayList
和 HashMap
以及覆盖 equals()
和 hashCode()
,以及一般的 OOP Single responsibility principle 和 Class cohesion
【讨论】:
我同意电影和演员之间最好有依赖关系;毕竟,如果一个演员在另一部电影中演出,从领域的角度来看,这实际上并没有改变他。但是,Actor
类没有充分的理由);照原样,它只是一个简单的Person
。然后,您可以重用该类来为电影添加更多团队成员,例如制片人、音乐家等。【参考方案3】:
关于你的课程的两个 cmets...
为什么不这样宣布演员的电影:
private List<Film> myFilms = new ArrayList<Film>();
这样,您将能够动态地从您的演员对象中添加和删除电影对象引用。例如,您可以为列表实现 getter 和 setter 并从外部对其进行操作。列表(或一般的集合)比原始数组更容易操作。
考虑用第一个大写字母声明类,这是一种约定。例如:Actor
、Film
。
【讨论】:
“关于你的课程的两个comments
”。
感谢 Martin 的回复,arrayList 是私有的,但不允许我从主类访问它吗?我需要将演员类中的电影数组中的演员电影复制到主要的1个数组中。
@AnonOmus 您通过公共方法访问它。例如,addFilm
可以是公共的(可从 main 调用),然后将一个项目添加到电影列表中。您还可以拥有一个公共getFilms
,它返回列表(或它的副本)。与删除膜相同。在 Java 中,我们通常通过方法访问所有内容。 object.field = value 几乎永远不会完成。
如果您声明 getter/setter 方法,您可以从外部访问列表,并且您可以从列表中添加/删除元素而无需担心(只要您不执行任何多线程操作,但我想这是不属于你的任务)...【参考方案4】:
您可以在class actor
中编写一个自增容器,例如vector ArrayList
等等。或者你可以自己实现一个动态数组。
【讨论】:
为什么会有人自己实现动态数组?迄今为止,几乎所有需要的实现都已提供。以上是关于基本面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章