如何组织我的抽象?

时间:2012-09-14 15:35:46

标签: java abstraction

我在课堂上有一组功能。这些功能是一组最低的共性。

为了能够运行这个,我需要生成某些信息,但是这个信息可以从我的班级来自两条路线之一。

我会试着总结一下我的情况......

让我们说我有一个课程如下:

public class onHoliday(){

    private Object modeOfTravel;
    private Object location;

    public onHoliday(Object vehicle, Location GPScoords) {
    }
    private boolean haveFun() {
        //function to have fun, needs 4 people
    }
}

让我们想象一下,我可以开车或骑车去度假。

我的haveFun()功能取决于我的车辆类型。

但只是松散地。我有另一个函数来确定我的车辆类型,并提取所需的值。例如,如果我发送汽车,我可以一次性获得4个人,但如果我发送自行车,我需要至少2个才能获得所需的4个

我目前有两种选择:

  1. 重载我的构造函数,因为我可以将两辆自行车或一辆汽车送入其中,然后我可以调用两个中间函数中的一个(例如,获取我的4个人的名字){{{ 1}} - 这就是我目前正在做的事情。

  2. 将两个构造函数拆分为两个独立的类,并在第三个类中重复我的haveFun(),这将成为我的另外两个类的对象。我的问题是我的中间函数只是几行代码,我不想把它们放在一个单独的文件中! (我总是将课程放在单独的文件中!)

  3. 请注意,我的haveFun()不是我在这两个课程之外需要的东西,甚至不是haveFun()(即我没有机会做onHoliday haveFun() 1}}一个周末或一个晚上!)。

    我有把haveFun()放到接口中,但是只有一个方法的接口看起来有点毫无价值!即使这样,我也必须在两个类中使用该方法 - 一个用于自行车,另一个用于汽车!

    我曾考虑让我的onHoliday班级接受任何对象类型,但我不希望有人不小心将船送到我的onHoliday班级(想象我不能游泳,所以它不会发生。)

    值得注意的是,我的onHoliday类是包私有,最后是。它实际上只能通过其他类中的其他“私有方法”访问,并且本身只有私有方法。

    EDIT1:

    我确信有人会建议我在将数据发送到onHoliday()类的类中处理它。但是这个类(让我们称之为travel())没有理由关心我正在使用的whay类型的车辆,如果我这样做它确实关心,我只是将问题移到了树的另一个地方。现在必须重新编写我的所有中间类来访问汽车或自行车,目前他们只是接受一个车辆对象,它有一个布尔开关来确定它是自行车还是汽车。

    EDIT2:

    我还有另外一个关于运行我的乐趣的抽象课程,然后在我的自行车或汽车课程中将其作为“内部课程”实施。然后我可以访问我的自行车或班级的成员。这也有意义吗?

    注意:我应该提一下,我必须在我的onHoliday()clas中确保我至少有4个人。

    考虑它可能是另一种方式......

    我可以获得一个多页面文件,并从传递的页码列表中提取我需要的页面。 或者我可以获得多个文件的列表。

    在第一种情况下,我发送一个文件对象,并选择页码 在第二个我发送多个文件对象(预先选择我感兴趣的对象)。

    事实上,这可能是一个更好的描述

2 个答案:

答案 0 :(得分:1)

你的代码示例有很多编译问题,但我想我知道你在问什么。如果您有一个抽象类Vehicle,则可以在具体类中实现haveFun()(即BikeCar。您的Holiday类构造函数可以使用Vehicle参数。无论它是什么类型的车辆,实施都在假日之外 - 而不是作为车辆的一部分。

你确实说它虽然是有趣的和车辆之间的松耦合。如果在Vehicle中实现hasFun没有意义,那么在Holiday中只有一个方法来确定它 - 这个方法的负面因素是你必须检查你拥有的每种类型的车辆(即{{ 1}})

如果你选择后者,你可以在构造函数中做任何事情。你想要一个方法,说添加人和车辆...... if vehicle instanceof Bike then... else if....。然后在添加完所有后运行isFun()。

答案 1 :(得分:0)

我可能会提出第三种方法:创建一个Vehicle类来处理移动的人。

public abstract class Vehicle {

    public void travel(Location location) {}

    public abstract int getCapacity();

    //etc.
}

public class Bicycle extends Vehicle {

    @Override
    public int getCapacity() { return 2; }

}

public class Car extends Vehicle {

    @Override
    public int getCapacity() { return 4; }

}

final class onHoliday {

    private Vehicle vehicle;

    public onHoliday(Vehicle vehicle) {
        this.vehicle = vehicle;
        haveFun();
    }
}

然后,如果你有任何CarBike会做出不同的事情(但他们都会这样做),只需将它们抽象为Vehicle类并覆盖