2017-04-05 141 views
-1

我想要創建一個名爲RoomBase的類,它有一個抽象方法和兩個屬性,我需要讓我的程序工作,因此RoomBase類繼承getRoomDetailsFromUser()所做的所有事情類Room抽象類繼承另一個類的方法和屬性

RoomBase類:

public abstract class RoomBase { 

    public abstract void getRoomDetailsFromUser(); 
    private int roomNumber; 
    private int NumberOfSeats; 
} 

Room類:

public abstract class Room implements Bookable { 
    Scanner input = new Scanner(System.in); 
    private static int roomNumber; 
    private static int numberOfSeats; 
    private static String reservedBy = ""; 
    private static boolean reserved; 
    private static boolean hasSmartBoard; 

    /** 
    * Get the attribute values from the user. 
    */ 

    public Room(int roomNumber) { 
     this.roomNumber = roomNumber; 

    } 

    public void getRoomDetailsFromUser() { 

     System.out.print("Enter number of seats: "); 
     numberOfSeats = input.nextInt(); 
     input.nextLine(); 
     System.out.print("Does this classroom have a smart board? (Y/N)"); 
     hasSmartBoard = input.nextLine().equalsIgnoreCase("y"); 

    } 

    public boolean isHasSmartBoard() { 
     return hasSmartBoard; 
    } 

    public void setHasSmartBoard(boolean hasSmartBoard) { 
     this.hasSmartBoard = hasSmartBoard; 
    } 

    public static int getNumberOfSeats() { 
     return numberOfSeats; 
    } 

    public void setNumberOfSeats(int numberOfSeats) { 
     this.numberOfSeats = numberOfSeats; 
    } 

    public String getReservedBy() { 
     return reservedBy; 
    } 

    public void setReservedBy(String reservedBy) { 
     this.reservedBy = reservedBy; 
    } 

    public boolean isReserved() { 
     return reserved; 
    } 

    public void setReserved(boolean reserved) { 
     this.reserved = reserved; 
    } 


    public int getRoomNumber() { 
     return roomNumber; 
    } 

    /** 
    * Update the room to reserved and get the reserved by. 
    */ 

    public void reserveThisRoom(){ 
     this.reserved = true; 
     System.out.println("Enter the name of the person reserving this room: "); 
     reservedBy = input.nextLine(); 
    } 

    /** 
    * Update the room to not reserved and clear the reserved by. 
    */ 

    public void releaseThisRoom(){ 
     this.reserved = false; 
     reservedBy = ""; 
     System.out.println("Room has been released\n"); 
    } 

    public String toString() { 
     String output = "\n\n******************************" 
      + "\nRoom Number: " + roomNumber 
      + "\nNumber of Seats: " + numberOfSeats 
      + "\nReserved By: " + reservedBy 
      + "\nReserved: " + reserved 
      + "\nSmart Board: "+ hasSmartBoard; 
     return output; 
    } 
} 

回答

0

我認爲你必須考慮多一點的設計比實現,讓我們來看看,例如什麼類層次結構將是,而且最重要的是,爲什麼。

這是否有任何意義,RoomBase擴展或從Room類獲取邏輯,不應該以其他方式?所以它真的是基地一個基類?現在如果getRoomDetailsFromUser方法的邏輯應該是一個普通的或基本的代碼,它不會在基類中,而是在特定的類中(在這種情況下是空間),並且完成後,你真的需要一個抽象類嗎?或者一個普通的基類能滿足你的需求?

檢查設計,讓我知道如果我可以幫助你更進一步。

0

這個問題有點不清楚,你想實例化RoomBase嗎?或者它應該保持抽象。 Room應該從RoomBase繼承嗎?似乎如此的名字暗示了這一點,Roob並不抽象。

要回答你的問題,我猜可能是最好的: 我看到的唯一方法是讓RoomBase擴展房間。有了這個,你將繼承房間中的所有內容,而不僅僅是方法。但只繼承該方法將不起作用,因爲此getRoomDetailsFromUser()使用僅在Room中定義的變量,但不在RoomBase中定義。

0

如果我不理你給你的類的名稱,那麼答案很簡單:

我需要讓我的工作方案,因此RoomBase類繼承一切的getRoomDetailsFromUser()確實在客房類。

public abstract class RoomBase extends Room { 
} 

當然你不能實例化一個抽象類,所以利用這一類的你需要創建的RoomBase具體子類:

public class BathRoom extends RoomBase { 
} 

RoomBase someBathRoom = new BathRoom(); 

雖然這回答您的問題確切地說,這是一個不尋常的類層次給定的名稱。一種可能更常見的模式,將是:

public interface Room extends Bookable { 
     method signatures that Rooms have 
} 

public abstract class RoomBase implements Room { 
     methods common to all rooms go here 
} 

public class BathRoom extends RoomBase { 
     methods implementing abstract methods from RoomBase 
     methods unique to BathRoom 
} 

還要注意,許多Java程序員今天使用繼承適度 - preferring composition