2012-02-28 10 views
1

私は小さなプロジェクトに取り組んでいます。予約のためのメインの抽象クラスと、ユーザーの名前/住所などの抽象クラスからメソッドを継承する2つのサブクラス、ホテル予約用とフライト予約用の2つのサブクラスがあります。スーパークラス/継承/コンストラクタの使用

新しいホテル予約のコンストラクタを作成するために、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

+1

特にスーパークラスからコンストラクタを呼び出す必要はありません。あなたはそれなしで試しましたか? – tartak

+0

私はスーパークラスのメソッドを使用するSubクラスのコンストラクタをしたいです..または私は間違ったツリーを吠えています。本質的にプログラムのやりとりに関しては、ユーザーは必要なすべての要素を入力して、ホテル側のコンストラクターを使用します。私が抽象クラスを持っているという考えは、物事が2度書き込まれるのを防ぐことであり、それを使うことはプロジェクトの必要条件です。 (本質的にX、Y、Zを含むプログラムを作成してください)私はこれを間違った方法で取り組んでいれば、間違いから学ぶことができます。 –

答えて

3

Bookingにデフォルトのコンストラクタがないためです。継承クラスのコンストラクタからsuperを呼び出すときには、適切なコンストラクタが呼び出される必要があります。だから、

、あなたは:コンストラクタはBookingで、このようなコンストラクタを探していることを

Hotel() { 
    super(); 
} 

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

あなたの助けてくれてありがとう、私は似たようなことを試してみましたが、特にプログラムで後に特定の変数を呼び出すことで問題が発生しましたが、これは実際の問題とは対照的にプログラムがどのように実行されるのか、よろしく。 –

3

あなたは、基本クラスに引数なしのctorのを呼び出そうとしませんが、どれです存在する。 argsを使用してctorを定義すると、デフォルトのno-arg ctorは「なくなります」。 Bookingの引数なしの引数を指定するか、サブクラスのパラメータを持つ関数を呼び出します。


Javaメソッドは、通常、小文字で始まります。読みやすさを向上させるために、以下の規約に従うことをおすすめします。パラメータと非static finalプロパティも小文字で始める必要があります。

+0

私は単純にBooking(){}だったコンストラクタを見ていましたが、fname/Firstnameのようなスーパークラスの要素をどのように参照するのか混乱してしまいました。 –

1

クラスBookingには、いくつかの引数を取るコンストラクタが1つしかありません。あなたのクラスHotelは、単に存在しない引数(super())なしでコンストラクタを呼び出そうとします。

非argコンストラクタをBookingに追加するか、またはHotelのコンストラクタコールsuper(...)に値の正しい数(および種類)を指定する必要があります。通常、サブクラスのコンストラクタは、サブクラス化の理由に応じて、スーパークラスのコンストラクタと同じかそれ以上の引数を持つようになります。

+0

ありがとうございます - 参考になる説明。 –

1

あなたが定義されていないコンストラクタに呼びかけている:

super(); 

Booking() 

に呼び出します。しかし、あなたはparametedコンストラクタを定義しているので、そのコンストラクタが存在しません。予約時にデフォルトのコンストラクタを作成するか、サブクラスのパラメータ化されたコンストラクタを呼び出す必要があります

+0

ありがとう - たくさんの意味があります。 –

関連する問題