• 我对面向对象理解有误?

    2015/12/08 93吸血鬼 23 评论

作为一个自己摸爬滚打的编程爱好者,我常常会质疑自己的一些想法。虽然写了不少代码,但是最近也来越觉得有点糊涂,在面向对象的设计过程中,我常常纠结与一个字段放在哪里,在哪里初始化这种问题上,虽然大部分时候无关紧要,但是还是有点逼死了强迫症。

比如,我需要设计一个“车”类,所有的“车”都有“轮子”吧。然后我写了一个抽象类

那么问题来了,有的车有4个轮子,有的车有6个轮子,有的有10个。。。。。。。这个字段到底要放在哪里?

放在子类可以很好的解决,但是想抽象出来,放在父类里,没有办法使用,真是纠结。

总结一下,就是所有子类都有某个属性,但属性的值不一样,这样的属性怎么定义合适?

2 收藏


直接登录
最新评论
  • HelloWorld   2015/12/08

    新类,轮子

  • 恩? 不是在车类搞个属性,存放车的类型,然后用枚举规定类型有几个轮子么。

  • 这个和继承没关系呀~~~再弄个新类轮子。数量的字段当然放在车的类里面。具体的业务逻辑也是要根据需求来的。

    • 93吸血鬼 学生 2015/12/09

      如果属性是抽象的怎么办?万一是速度呢?比如最大速度。卡车和小汽车都是有最大速度但是不一样,这也成个新类,感觉怪怪的

  • 什么叫抽象。。。类中的属性不就是抽象出来的么 卡车小汽车都是汽车呀 汽车类有一个属性叫做最大速度

    • 93吸血鬼 学生 2015/12/09

      那你怎么给这个最大速度赋值?比如java里,你既然在汽车类里定义了最大速度(static),所有汽车的最大速度就都一样了,但是显然小汽车和卡车最大速度不一样。

      • 你为啥要定义成static的。。。

        • 93吸血鬼 学生 2015/12/09

          因为所有的小车都一样,所有的卡车又都一样。当然这是速度,但是如果是一个比较大的数据,不用static的每个对象都维护一份太浪费了

          • 那也不应该用static哟~~~你可以把汽车对象new出来 然后给他们赋值。
            如果系统中本来就需要区分卡车,小车等不同的汽车类型的话,你可以搞一个卡车类,一个小车类,然后他们都继承汽车类,这样卡车一个速度 小车一个速度~~

  • pqiao 程序猿 2015/12/09

    static ?

    • 93吸血鬼 学生 2015/12/09

      所有对象都一样呗。你看下我回复的评论,纠结那个

      • 你不是每个子类的最大速度不一样么。。 用汽车类统一操作有什么用呀

        • 93吸血鬼 学生 2015/12/09

          怎么会没用呢。。。。。肯定有地方会用到吧。比如我要看一辆车的速度有没有超过最大速度,那不管什么汽车,我只要操作汽车就可以了啊(假设最大速度是标称最大速度)。
          `vehicle.speed < vehicle.maxSpeed`

          ps:当然我知道右边如果是static的最好用类名引用。BUT,如果真的遇到这样子的情况了,咋整

  • 打字员小张 打字员小张 2015/12/09

    /**
    * 轮子抽象类
    */
    public abstract class Vehicle{
    protected static final int maxWheelNum = 12;//最大轮子数
    protected Integer wheelNum; //抽象父类的实际轮子属性
    protected static final motoWheelNum = 2;//可能的摩托子类的固定轮子数 @Tag4
    protected static final bicycleWheelNum = 2;//可能的自行车子类的固定轮子数@Tag5
    }

    /**
    * 摩托轮子类
    */
    public class motoVenicle extends Vehicle{
    private static final int motoWheelNum = 2;// 摩托轮子的数量常量 @Tag3
    public motoVenicle (Integer wheelNum){
    checkNumValid(wheelNum);

    this.wheelNum = wheelNum;// @Tag1
    }
    private void checkNumValid(Integer wheelNum){
    if(wheelNum.intValue() > Vehicle.maxWheelNum){
    //do what u want;
    }
    }
    }
    /**
    * 使用摩托轮子的类
    */
    public class useVehicle{
    @Test
    public void fun(){
    Vehicle vi = new motoVenicle(2);//@Tag2
    }
    }

    如果我猜的不错,楼主既不想做@Tag1和@Tag2,又嫌子类可能不止摩托一个,@Tag3费劲。还觉得@Tag4和@Tag5麻烦。

    子类的属性由抽象父类统一管理,这种情况好像只出现在父类作为方法参数的时候吧。那又有什么关系呢。先做@Tag1,之后想干什么就干什么啊