2012-02-28 54 views
1

我正在開發一個小項目。將有一個主要抽象類的預訂,兩個子類,一個用於酒店預訂,另一個用於航班預訂,它們都繼承抽象類的方法,例如用戶的姓名/地址等。使用SuperClass/Inheritance /構造函數問題

嘗試爲一個新的酒店預訂創建一個構造函數,我遇到了一個問題,它使用super()函數繼承了抽象類中的方法/變量。

的錯誤:

Constructor in class booking can not be applied to given types. 

這裏是我的代碼:

import java.util.Scanner; 


abstract class Booking{ 


    private String fname; 
    private String lname; 
    private int HouseNo; 
    private String Street; 
    private String Postcode; 


    Scanner in = new Scanner(System.in); 


    //Parameterized Constructor 
    Booking(String FirstName, String Lastname, int Housenumber, String thestreet, String 
    thePostcode)      

    { 
    fname = FirstName; 
    lname = Lastname; 
    HouseNo = Housenumber; 
    Street = thestreet; 
    thePostcode = Postcode; 
    } 




    //Acessor Methods below 
    String getfname() 
    { 
fname = "sds"; 
return fname; 
} 

void setFname(String FirstName) 
{ 
fname = FirstName; 
} 

String getlname() 
{ 
return lname; 
} 

void setLname(String LastName) 
{ 
lname = LastName; 
} 

int getHouseNo() 
{ 
return HouseNo; 
} 

void setHouseNo(int HouseNumber) 
{ 
HouseNo = HouseNumber; 
} 

String getStreet() 
{ 
return Street; 
} 

void setStreet(String StreetName) 
{ 
Street = StreetName; 
} 

String getPostcode() 
{ 
return Postcode; 
} 

void setPostcode(String ThePostcode) 
    { 
Postcode = ThePostcode; 
} 


abstract public String Verification(); 
{ 
} 

import java.util.Scanner; 

class Hotel extends Booking{ 



Scanner in = new Scanner(System.in); 

private String TheVerification; 
private int guests; 
private String Roomtype; 

Hotel(){ 
    super(); 
    TheVerification = Verification(); 
    guests = 0; 
    Roomtype = Roomtype(); 
} 

public String Verification(){ 
    System.out.println("Please provide your car reg as verification"); 
    TheVerification = in.next(); 
    return TheVerification; 

} 

public String Roomtype(){ 
    System.out.println("Would you like a Premiun or Regular room?"); 
    Roomtype = in.next(); 
    return Roomtype; 
} 



public void print(){ 
    System.out.println("Roomtype" + Roomtype); 

} 


} 
+1

那麼是什麼問題? – Adrian 2012-02-28 14:10:40

+1

您不必特別調用超類的構造函數。你沒有嘗試過嗎? – tartak 2012-02-28 14:11:51

+0

我想要Sub類的構造函數使用超類方法..或者我吠叫錯誤的樹。基本上在程序交互中,用戶將使用Hotel側的構造函數,輸入所有需要的元素。對於我來說抽象類的想法是防止事情被寫出兩次,並且使用一個是項目的一個要求。 (本質上創建一個包括X,Y,Z的程序)如果我解決了這個錯誤的方式,請這麼說,只能從錯誤中學習.. – 2012-02-28 14:17:19

回答

3

您得到此錯誤的原因是因爲Booking中沒有默認構造函數。當您從繼承類的構造函數中調用super時,必須有適當的構造函數來調用。

所以,當你這樣做:

Hotel() { 
    super(); 
} 

該構造函數在Booking在尋找這樣一個構造函數:

Booking() { 
    ... 
} 

然而,Booking只有這個構造:

Booking(String FirstName, String Lastname, int Housenumber, String thestreet, String 
    thePostcode) { 
    fname = FirstName; 
    lname = Lastname; 
    HouseNo = Housenumber; 
    Street = thestreet; 
    thePostcode = Postcode; 
} 

因此,您需要在中創建一個默認構造函數或更改Hotel構造函數傳遞參數,就像這樣:

Hotel(String FirstName, String Lastname, int Housenumber, String thestreet, String 
    thePostcode) { 
     super(FirstName, Lastname, Housenumber, thestreet, thePostcode); 
     ... 
} 

不過,我認爲你應該重新考慮你的類層次結構。 Hotel真的是Booking的一個子類,或者Hotel是否包含許多Booking實例?

+0

感謝您的幫助,我試過類似的東西,但遇到了問題,特別是隨後在程序中調用了某些變量,但這是由於我自己對程序運行的愚蠢而不是實際問題,致以我的問候。 – 2012-02-28 14:37:18

3

你試圖調用一個無參數的構造函數的基類,但沒有存在。一旦用args定義了一個ctor,默認的no-arg ctor「消失」。要麼爲Booking提供無參數ctor,要麼使用子類中的參數調用該參數。


Java方法通常以小寫字母開頭;我建議遵循以下約定來提高可讀性。參數和非靜態最終屬性也應以小寫字母開頭。

+0

爲我所看到的乾杯包括一個簡單的Booking(){}的構造函數,但是如何引用超類的元素(如fname/Firstname)讓我陷入困境。 – 2012-02-28 14:30:43

1

您的課Booking只有一個構造函數,只需要幾個參數。你的班級Hotel試圖調用一個沒有任何參數的構造函數(super()),它根本不存在。

您需要將一個非參數構造函數添加到Booking或者讓Hotel的構造函數調用super(...)提供正確的值(和類型)值。根據子類的原因,通常你的子類構造函數與超級類構造函數具有相似或相同的參數。

+0

謝謝你 - 有用的解釋。 – 2012-02-28 14:31:46

1

要調用的構造函數還沒有定義:

super(); 

會打電話給

Booking() 

但既然你已經定義了一個parameted構造函數,構造函數不存在。您必須在Booking中創建默認構造函數或調用子類中的參數化構造函數

+0

感謝您的支持 - 非常有意義。 – 2012-02-28 14:31:00