基本面向对象编程

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 几乎完全陌生,所以这对我来说是一项棘手的任务。

任何建议或正确方向的观点将不胜感激。

【问题讨论】:

为什么演员myFilmsint的数组?为什么不是film 的数组? 是的,电影数组 (Film[])。还有一个约定,每个类名必须以大写字母开头。 ArrayList&lt;Film&gt; 会更好 我会使用 List 而不是数组来保存电影。或者至少是一个 ArrayList。这样,您将每个演员的最大电影数量限制为 3。 更正:是的 myFilm 数组应该是一个字符串。我遇到的麻烦是弄清楚如何让每个演员 myFilm 数组动态显示仅与他们相关的电影标题。 【参考方案1】:

如果你有一个数据库,其中有一个包含用户名和电影(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&lt;Actor,Integer&gt; 将演员映射到他们的出场次数计数器。

这可能是一个冗长的操作,因此您可以考虑兑现结果(如上图) - 解决方案可以是地图、ActorStatistics 类、actor 中的简单 timesPlayed 字段等。

不要害怕反对

不要费力地将电影映射到 id(例如您的 id,它可能与您的电影代码 String 相关联,这会增加另一个类型不兼容的问题。 尝试使用更多对象引用而不是变通方法,并使用List 而不是数组。

一般来说,阅读 Java 中的 Collections,例如 ArrayListHashMap 以及覆盖 equals()hashCode(),以及一般的 OOP Single responsibility principle 和 Class cohesion

【讨论】:

我同意电影和演员之间最好有依赖关系;毕竟,如果一个演员在另一部电影中演出,从领域的角度来看,这实际上并没有改变他。但是,Actor 类没有充分的理由);照原样,它只是一个简单的Person 。然后,您可以重用该类来为电影添加更多团队成员,例如制片人、音乐家等。【参考方案3】:

关于你的课程的两个 cmets...

    为什么不这样宣布演员的电影:

    private List&lt;Film&gt; myFilms = new ArrayList&lt;Film&gt;();

    这样,您将能够动态地从您的演员对象中添加和删除电影对象引用。例如,您可以为列表实现 getter 和 setter 并从外部对其进行操作。列表(或一般的集合)比原始数组更容易操作。

    考虑用第一个大写字母声明类,这是一种约定。例如:ActorFilm

【讨论】:

“关于你的课程的两个comments”。 感谢 Martin 的回复,arrayList 是私有的,但不允许我从主类访问它吗?我需要将演员类中的电影数组中的演员电影复制到主要的1个数组中。 @AnonOmus 您通过公共方法访问它。例如,addFilm 可以是公共的(可从 main 调用),然后将一个项目添加到电影列表中。您还可以拥有一个公共getFilms,它返回列表(或它的副本)。与删除膜相同。在 Java 中,我们通常通过方法访问所有内容。 object.field = value 几乎永远不会完成。 如果您声明 getter/setter 方法,您可以从外部访问列表,并且您可以从列表中添加/删除元素而无需担心(只要您不执行任何多线程操作,但我想这是不属于你的任务)...【参考方案4】:

您可以在class actor 中编写一个自增容器,例如vector ArrayList 等等。或者你可以自己实现一个动态数组。

【讨论】:

为什么会有人自己实现动态数组?迄今为止,几乎所有需要的实现都已提供。

以上是关于基本面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象编程 对象的基本概念

面向对象编程的四大基本特征

Java面向对象-面向对象编程之基本概念

面向对象(OOP)基本概念

关于java面向对象编程和面向接口编程区别

python中的oop面向对象基本编程(类实例魔术)