簡體   English   中英

如何組織我的抽象?

[英]how to organise my 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. 重載我的構造函數,以便我可以發送兩輛自行車或一輛汽車,然后可以在我具有haveFun()之前調用2個中間函數之一(例如,獲取4個人的名字haveFun() -這就是我的意思目前正在做。

  2. 將兩個構造函數分成兩個單獨的類,並在第三個類中重復我的haveFun() ,這成為我另外兩個類的對象。 我的問題是我的中間函數只有幾行代碼,我不想將它們放在單獨的文件中! (我總是將類放在單獨的文件中!)

請注意,在這兩個類之外,甚至在onHoliday ,我都不需要我的haveFun() (即,我沒有機會在周末或晚上做一些haveFun() ! )。

我雖然有關於將haveFun()放入接口的信息,但是只有一個方法的接口似乎有點不值錢! 即使那樣,我仍然必須在兩個類中都使用該方法-一個用於自行車,另一個用於汽車!

我曾經考慮過讓onHoliday類接受任何對象類型,但是我不希望有人不小心將小船onHoliday我的onHoliday類中(想象我不會游泳,因此不會發生)。

可能需要注意的是,我的onHoliday類是包私有的,並且是最終的。 實際上,只能通過其他類中的其他“私有方法”來訪問它,並且本身僅具有私有方法。

編輯1:

我確定有人會建議我在將數據發送到onHoliday()類的類中進行處理。 但是這個類(我們稱其為travel())沒有理由關心我正在使用的白色類型的車輛。如果這樣做,那么我確實將問題移到了樹的另一端。 現在,必須重寫我的所有中級課程,以訪問汽車或自行車,因為他們現在只接受一個帶有布爾開關的車輛對象,該對象可以確定它是自行車還是汽車。

編輯2:

不過,我還有另一個要講的是運行一個抽象類來運行我的樂趣,然后在我的自行車或汽車類中將其實現為“內部類”。 然后,我可以訪問我的自行車或班級的成員。 這也有意義嗎?

注意:我可能應該提到,我必須確保在onHoliday()中至少要有4個人。

也許另一種思考方式是...

我可以獲得一個多頁文件,並從傳遞的頁碼列表中提取所需的頁面。 或者,我可以獲得多個文件的列表。

在第一種情況下,我發送一個文件對象,在第二種情況下,選擇頁碼發送多個文件對象(預先選擇我感興趣的文件對象)。

實際上,這可能是一個更好的描述

您的代碼示例有很多編譯問題,但是我想我知道您的要求。 如果您有一個抽象類Vehicle ,則可以在具體類(例如BikeCar haveFun()中實現haveFun() 。Holiday類的構造函數可以采用Vehicle參數。無論它是哪種類型的車輛,實現都在Holiday之外-而不是作為車輛的一部分。

您確實說過,盡管樂趣與車輛之間是松散的耦合。 如果它沒有意義的實現在車輛haveFun,那么就在假日的方法,確定它-負此方法雖然是你必須檢查每個車的你(即if vehicle instanceof Bike then... else if....

如果您選擇后者,則可以在構造器中進行任何操作。 您可能想要一個說add的人員和車輛的方法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();
    }
}

然后,如果您有任何事情要讓CarBike做不同的事情(但是他們倆都會做),只需將它們抽象到Vehicle類中並覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM