0

クラスにある一連の関数があります。これらの関数は、共通性が最も低いセットです。

これを実行できるようにするには、特定の情報を生成する必要がありますが、この情報は 2 つのルートのいずれかからクラスに到達する可能性があります。

状況をまとめてみますと……。

次のようなクラスがあるとしましょう。

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 人を獲得できるかもしれませんが、自転車を送った場合、必要な 4 人を獲得するには少なくとも 2 人必要です。

現在、次の 2 つのオプションがあります。

  1. コンストラクターをオーバーロードして、2 台の自転車または 1 台の車をコンストラクターに送信できるようにします。次に、2 つの中間関数のいずれかを呼び出すことができます (たとえば、4 人の名前を取得するため)。haveFun()これが現在行っていることです。 .

  2. 2 つのコンストラクターを 2 つの別個のクラスに分割haveFun()し、3 番目のクラスで my を繰り返します。これは、他の 2 つのクラスのオブジェクトになります。これに関する私の問題は、中間関数がすべて数行のコードであり、それらを別のファイルに入れたくないということです! (私はいつもクラスを別々のファイルに入れます!)

注意してください、私haveFun()はこれらの 2 つのクラスの外で必要になるものではありません(つまり、週末や夜にonHoliday何かをする可能性はありません!)。haveFun()

私はインターフェイスに入れることについて考えhaveFun()ましたが、メソッドが 1 つしかないインターフェイスを持つのは少し価値がないようです! それでも、自転車用と車用の両方のクラスでメソッドを使用する必要があります。

onHolidayクラスで任意のオブジェクト タイプを受け入れられるようにすることを考えましたが、誰かが誤ってボートをonHolidayクラスに送り込むことは望ましくありません (私は泳げないので、そのようなことは起こらないと想像してください)。

onHoliday私のクラスはパッケージプライベートであり、最終的であることに注意することが重要かもしれません. 実際には、他のクラスの他の「プライベート メソッド」を介してのみアクセスされ、プライベート メソッド自体しかありません。

編集1:

データを onHoliday() クラスに送信するクラスでこれを処理することを誰かが提案すると確信しています。しかし、このクラス ( travel() と呼びましょう) には、私が使用している車両の種類を気にする理由はありません。気にするようにすると、問題をツリーのさらに上の別の場所に移動しただけです。そして今、すべての中間クラスを車または自転車のいずれかにアクセスするように書き直す必要があります。今のところ、それらは単純に車両オブジェクトを受け入れます。このオブジェクトには、自転車か車かを判断するためのブール値スイッチがあります。

編集2:

楽しみを実行するための抽象クラスを作成し、それを自転車または車のクラスのいずれかで「内部クラス」として実装することについて、別のことがありました。次に、バイクまたはクラスのメンバーにアクセスできます。これも意味がありますか?

注: おそらく、onHoliday() クラスで少なくとも 4 人が参加していることを確認する必要があることに言及する必要があります。

たぶん、それを考える別の方法は...

複数ページのファイルを取得し、渡されたページ番号のリストから必要なページを抽出できます。または、複数のファイルのリストを取得できます。

最初のケースでは単一のファイル オブジェクトを送信し、2 番目のケースではページ番号を選択して複数のファイル オブジェクトを送信します (関心のあるファイルを事前に選択します)。

実際、それはおそらくより良い説明です

4

2 に答える 2

1

あなたのコードサンプルには多くのコンパイルの問題がありますが、私はあなたが何を求めているかを知っていると思います。抽象クラスがある場合は、具象クラスVehicleに実装できhaveFun()ます(つまりBikeCarHolidayクラスコンストラクターはVehicleパラメーターを受け取ることができます。車両のタイプに関係なく、実装は、Vehicleの一部としてではなく、Holidayの外にあります。

あなたはそれが楽しみと乗り物の間であるけれどもそれが緩い結合であったと言いました。VehicleにhaveFunを実装することが意味をなさない場合は、Holidayにそれを決定するメソッドを用意します。ただし、このメソッドの欠点は、所有しているVehicleのタイプごとにチェックする必要があることです(つまりif vehicle instanceof Bike then... else if....

あなたが後者と一緒に行くならば、あなたは建設業者の何にでもすることができます。add's personandVehiclesというメソッドが必要になりますaddPerson(Vehicle)。次に、すべてを追加した後、isFun()を実行します。

于 2012-09-14T15:51:39.307 に答える
0

3番目のアプローチを提案するかもしれません: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とaのBike動作が異なる(ただし、両方の動作が異なる)場合は、それらをVehicleクラスに抽象化してオーバーライドします。

于 2012-09-14T15:55:24.537 に答える