0

我有一组我在课堂上拥有的功能。这些函数是一组最低通用性。

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

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

可以说我有一个课程如下:

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. 重载我的构造函数,以便我可以将两辆自行车或一辆汽车送入其中,然后我可以在我之前调用 2 个中间函数之一(例如获取我的 4 个人的姓名)haveFun()- 这就是我目前正在做的事情.

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

请注意,haveFun()除了这两个课程之外,我不需要,甚至不需要我的东西onHoliday(即,我没有机会haveFun()在周末或晚上做一些事情!)。

我虽然有关于放入haveFun()一个接口,但是只有一个方法的接口似乎有点毫无价值!即使那样,我也必须在两个课程中都使用该方法-一个用于自行车,另一个用于汽车!

我曾想过让我的onHoliday班级接受任何对象类型,但是我不希望有人意外地把船送到我的onHoliday班级(想象一下我不会游泳,所以它不会发生)。

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

编辑1:

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

编辑2:

我刚刚有了另一个关于有一个抽象类来运行我的乐趣,然后在我的自行车或汽车类中将它作为一个“内部类”来实现。然后我可以访问我的自行车或班级的成员。这也有意义吗?

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

也许另一种思考方式是......

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

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

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

4

2 回答 2

1

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

您确实说过这是乐趣和车辆之间的松散耦合。如果在 Vehicle 中实现 haveFun 没有意义,那么只需在 Holiday 中使用一个方法来确定它 - 但是此方法的负面影响是您必须检查您拥有的每种类型的 Vehicle(即if vehicle instanceof Bike then... else if....

如果你选择后者,你可以在构造函数中做任何事情。你会想要一个方法说 add's people and Vehicles addPerson(Vehicle)...。然后在添加完之后运行 isFun()。

于 2012-09-14T15:51:39.307 回答
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();
    }
}

然后,如果您有任何 aCar和 aBike会做不同的事情(但他们都会做),只需将它们抽象放在Vehicle类中并覆盖。

于 2012-09-14T15:55:24.537 回答