Как организовать мою абстракцию?

У меня есть набор функций, которые у меня есть в классе. Эти функции представляют собой набор наименьшей общности.

Чтобы выполнить это, мне нужно сгенерировать определенную информацию, но эта информация может поступить с моим классом по одному из двух маршрутов.

Я постараюсь обобщить мою ситуацию....

Допустим, у меня есть класс следующим образом:

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() не то, что мне нужно за пределами этих 2 классов, или даже быть onHoliday (т.е. у меня нет шансов сделать что-то haveFun() на выходных или вечером!).

Я имею хотя бы о сдаче haveFun() в интерфейс, но кажется немного бесполезным иметь интерфейс только с одним методом! Даже тогда у меня должен был быть метод в обоих классах - один для велосипеда и другой для автомобиля!

Я думал о том, чтобы мой onHoliday класс, принимающий любой тип объекта, но тогда я не хочу, чтобы кто-то случайно отправил лодку к моему onHoliday класс (представьте, я не умею плавать, так что этого не случится).

Может быть важно отметить, что мой onHoliday класс является пакетом private и final. На самом деле к нему можно получить доступ только через другие "частные методы" в других классах, и он сам имеет только частные методы.

edit1:

Я уверен, что кто-то предложит мне обработать это в классе, который отправляет данные в класс onHoliday(). Но у этого класса (давайте назовем его travel()) нет причин заботиться о том, какой тип транспортного средства я использую. Если я сделаю так, чтобы это не заботило меня, я просто перенес проблему в другое место дальше по дереву. и теперь мне нужно переписать все мои промежуточные классы, чтобы получить доступ либо к машине, либо к байку, на данный момент они просто принимают объект транспортного средства, который имеет логический переключатель, чтобы определить, является ли это велосипед или автомобиль.

edit2:

У меня только что был еще один - иметь абстрактный класс для управления своим развлечением, а затем реализовать его как "внутренний класс" в классах велосипеда или автомобиля. Тогда я могу получить доступ к членам моего велосипеда или класса. имеет ли это смысл?

Примечание: я, вероятно, должен упомянуть, что я должен убедиться, что в моих классах onHoliday() у меня есть как минимум 4 человека.

Может быть, другой способ думать об этом...

Я могу получить многостраничный файл и извлечь нужные мне страницы из переданного списка номеров страниц. Или я могу получить список из нескольких файлов.

В первом случае я отправляю один объект файла, а при выборе номера страницы во втором я отправляю объект нескольких файлов (предварительно выбирая те, которые меня интересуют).

На самом деле это, вероятно, лучшее описание

2 ответа

У вашего примера кода МНОГО проблем с компиляцией, но я думаю, что знаю, о чем вы спрашиваете. Если у вас есть абстрактный класс VehicleВы можете реализовать haveFun() в конкретных классах (т.е. Bike, Car, Ваш конструктор класса Holiday может взять Vehicle параметр. Неважно, какой это тип транспортного средства, реализация находится за пределами Holiday - скорее, как часть транспортного средства.

Вы сказали, что это была слабая связь между забавой и транспортным средством. Если не имеет смысла реализовывать haveFun в Vehicle, то просто найдите метод в Holiday, который его определяет - но этот метод отрицателен тем, что вам придется проверять каждый тип вашего транспортного средства (т.е. if vehicle instanceof Bike then... else if....)

Если вы пойдете с последним, вы можете сделать что угодно в конструкторе. Вы хотели бы иметь метод, который говорит добавить людей и транспортные средства... addPerson(Vehicle), После того, как все было добавлено, запустите isFun().

Я мог бы предложить третий подход: создать 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();
    }
}

Затем, если у вас есть какие-либо вещи, которые Car и Bike будет делать по-другому (но они оба будут делать), просто поместите их в Vehicle класс и переопределить.

Другие вопросы по тегам