2012-02-28 111 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