一起学java简单点:如何用好成员变量和类方法(二)————is-a or has-a准则

        java的类方法和成员变量之前写的博文,感觉自己还是没有理解透彻,今天我觉得要再一次深入理解一下。

        类方法也好,成员变量也好,概念就算明白并不顶用,很多人都是会看书,但不会理解书,我就从我的理解来阐述试一下类方法和成员变量的使用。

        上一次的案例举的不好,这一次举一个更实际的例子:我们要设计一套非常简易的综合学生考评系统,通过对学生的考试成绩、课外社团评分来综合评定,为了人性化管理,大一、大二、大三、大四的考评机制是不一样的。

         我们根据这个需求来设计一下,当然真正的系统可能还要考虑其他因素,这里为了更好地理解面向对象编程而设计的。

         首先,我们分析一下考评系统的组成:学生的考试成绩、课外社团的成绩两块,学生对应考试,学生对应社团,都是多对多的关系,那么我们先建立学生。

class Student {
    private String name;
    private String student_id;
    
    public String getName(){
        return name;
    }
    
    public void setName(String inputname) {
        name = inputname;
    }
}

         其中getName()和setName()函数在上篇文章中说过,目的是为了保护类的私有成员变量,通过这种方法可以很方便的设置相应的权限防止不必要的损失。这就是最基本的类,我相信很简单可以写出来,现在我们来看看,由于是面向对象编程,那么student就是我们的对象,student到底能干嘛呢?这里要知道这几点:1. student肯定要知道谁是谁呀,那么自然就拥有学生号和姓名,这个我们已经设计过了。2. student的考试成绩,而且一个学生肯定要好几个科目,难道我们应该要设计成一个数组,里面存放成绩吗?那怎么判断是什么成绩呢?3. student的社团成绩,跟第2条一样具有好几个社团,而且无法固定是什么社团的。

          那么我们来想一想,科目成绩作为数组是对的,那么要区别科目,我们可以采用枚举的方法,还有对象的方法,我觉得对象更好,因为对象能做更多的事情,别忘了最重要的,扩展性能。于是我们就可以创建两个类:

class Course {
    private String name;
    private int mark;
    public int getMark(){
        return mark;
    }
    public void setMark(int inputmark){
        mark = inputmark;
    }
    public String getName(){
        return name;
    }
    public void setName(String inputname){
        name = inputname;
    }
}

class Association{
    private String name;
    private int mark;
    public int getMark(){
        return mark;
    }
    public void setMark(int inputmark){
        mark = inputmark;
    }
    public String getName(){
        return name;
    }
    public void setName(String inputname){
        name = inputname;
    }
}

        两个类已经构建完成了,也是最基本的类,那么我们就要在student类上修改了,需要增加社团的成绩以及课程的成绩,我们引用对象的数组来完成,所以把student类修改如下:

class Student {
    private String name;
    private String student_id;
    public ArrayList<Course> stucourse;
    public ArrayList<Association> stuassociation;
    
    public String getName(){
        return name;
    }
    
    public void setName(String inputname) {
        name = inputname;
    }
}

        我们增加了两个成员变量,代表学生参加的课程以及社团。接下来做最重要的事了,那就是我们要计算一个学生的综合分数,我们可以单独建立一个类来计算,还可以放在student类里面,因为要知道,这个分数是学生的,只有学生存在他才能调用,根据这个条件满足了“has-a”,也就是面向对象当中如何判断是类方法还是子类的一个判断准则,就是满足“has-a”还是“is-a”,如果是前者,那就是类方法,后者就是子类了。所以我们加一个方法在student类中。

public float performance(){
     //具体实现省略
}

那么一个学生的综合成绩就出来了,我们可以直接生成对象,但是大一到大四的评价标准都是不同的,可是大一到大四都是student类,总不能写4个类把,这个时候就满足“is-a”的准则,把大一到大四分别写成四个子类就可以了,子类可以继承父类所有的public方法,并且可以通过覆盖的形式重写performance函数,可以看看这个关系图:

class GradeOne extends Student{
    public int performance(){
        //大一的评分标准
    }
}
class GradeTwo extends Student{
    public int performance(){
        //大二的评分标准
    }
}
class GradeTwo extends Student{
    public int performance(){
        //大三的评分标准
    }
}
class GradeTwo extends Student{
    public int performance(){
        //大四的评分标准
    }
}

通过这样,我们就设计好这个考评系统了,当然这仅仅只是一个最最基础的例子,实际作为系统还需要考虑很多东西,不过这能够让我们能够更好的理解面向对象编程该如何进行思考和设计,所有的动作和流程都应该作为对象的一个部分来进行,就像一个人作为一个类,手臂是他的成员变量,同样他有了手臂后就可以拿东西作为一个方法,所有的系统同样都可以这样操作,要尽可能的找到共同特征。

        以上都是我的个人拙见,可能还不完善,需要和你共同进步勉励!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值