Blog-二

 

   对期中考试试题的思考与认识

7-1 点与线(类设计)
分数 20
  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:

      

       第一题:简单的类,其中没有继承,也没有多态。

                       只有类之间的相互调用;

        主要测试了我们的基础,对类的调用以及对垒的定义和书写是否是正确的。

 

在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。

  • 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
  • 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色
  • 在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。

                 

              第二题:用到了类之间的继承,是一个抽象类(抽象类中可以有非抽象方法,不一定要有抽象方法public  abstract,也可以有成员变量),用到了继承与多态。

               类属性的实现(static)

               私有属性的实现(private)

             

        

在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。

  • 在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList<Element>类型的对象(若不了解泛型,可以不使用<Element>
  • 增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象
  • 在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
    • 1:向容器中增加Point对象
    • 2:向容器中增加Line对象
    • 3:向容器中增加Plane对象
    • 4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
    • 0:输入结束

 

                相较于第二题:

                  第三题的题目多了一个类,这个类被用于实现对象的增,删,改,差。以及多次输出。

                 

 

   对于第三次实验(继承与多态一)

    

(1) 为之前的类添加合适的父类。

(2) 为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。

(3) 使用多态改进整个代码,提高代码的复用性。

1、 请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系。

2、 说明你设计的继承关系的理由,为什么不用组合

3、 说明你在哪部分代码中使用了多态,带来了什么好处。

       

                                   第一:    添加了一个共同的父类,名字是Passager{}

                                    第二:              并且把子类中相同的代码放进了父类中。

                                   第三:  在方法Eat(Passage   canbeeat,Passager  farmer){}  用到了多态

                                                     

 

     对于第三次实验(继承与多态二)

                  实验要求

                 

1、 农夫过河问题,将之前的代码进行如下改进:

(1) 修改程序代码,在游戏中增加胡萝卜、兔子两个角色,过河的规则改为一次可以带两样东西过河。

2、 请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系

3、 实现第一步的功能时,你的代码做了哪些修改。如何避免修改原有代码?

4、 修改系统功能,运行程序后,用户可以选择玩新规则(五个角色、一次两样东西带过河)或者老规则(三个角色、一次一样东西带过河)的游戏。

                

 实验改进    

           实现第一步时我的代码修改:

              首先新添加了两个类分别是Carrot(萝卜) Rabbit(兔子)同之前四个类一样都继承自同一个父类Passenger(乘客类)

              当然此时在Game类里面也相应的实例化了这两个新添加的类和GameGui里面

添加了  public void showStatus(Farmer farmer,Wolf wolf,Sheep sheep, Cabbage cabbage,Carrot carrot,Rabbit rabbit) {}

              过河规则的修改,我在原有的四个选择上新添加了十种情况,还有新规则和旧规则的选择,如果输入0,则选择了新规则,否则就是旧规则。

            避免代码修改:

            通过使用多态和继承的方式,提高了代码的复用性,如果想要添加新的元素,只要同之前类一样,继承并使用多态即可,这样,代码的修改非常简单,也很通用。

 

   通过这次实验我对java中类间关系的理解更加的深刻了,对与用idea的运用也更加熟练

 除此之外,我也发现了自己的不足,我的基础不牢固,对许多的东西都是似懂非懂,每次写代码都要翻笔记,记得不劳且理解不到位。例如此次类的继承,如果使用多态的形式,没有注意到变量的获得是父类的导致浪费了大量时间来发现错误

 

实验结            

 类图

 

          

类间关系:

唯一父类Passager{}

父类中的成员变量

  int flag = 0;

  private  boolean hasCross = false;

  private boolean isAlive = true;

父类中的方法

   Passenger() {

 

    }

    public void sethasCross() {

        this.flag++;

        if (this.flag % 2 == 0) {

            this.hasCross = false;

        } else {

            this.hasCross = true;

        }

    }

    public void setisAlive(boolean p){

        this.isAlive = p;

    }

    public boolean getisAlive(){

        return this.isAlive;

    }

    public boolean gethasCross() {

        return hasCross;

}

 

    public boolean Eat(Passenger caneated, Passenger farmer) {

        if (caneated.gethasCross() == hasCross && hasCross != farmer.gethasCross()) {

            caneated.setisAlive(false);

            return true;

        } else {

            caneated.setisAlive(true);

            return false;

        }

}//其中Passenger caneated, Passenger farmer利用了多态向上转型

  // 简化了代码使之简洁易读

全体子类:Carrot extends {} Cabbage extends {} Farmer extends {}

Wolf extends {}  Sheep extends{}  Rabbit extends {}

子类除了构造方法不一样外

共同拥有一个方法

  public void showStatus(){

 

        System.out.println("Sheep is alive  :"+super.getisAlive());

        System.out.println("Sheep has Cross  : " +super.gethasCross());

    }

里面的Sheep根据类的不同而有不同的输出。

船类: Boat{}无实际意义因为Farmer在哪里船就在那里,所以可以用Farmer判断就行

 

posted @ 2022-05-01 14:04  黄文豪大帅比  阅读(97)  评论(0)    收藏  举报