1

したがって、books、booksOut、および Allbooks の 3 つのクラスがあります。booksout と Allbooks は拡張機能であり、books のサブクラスです。ただし、問題/質問があります。

toString メソッドで allBooks からエラーが発生します。bookID など (つまり、 books 内のすべての変数) が private に設定されているとします。public 変数は常に避けるべきだと教えられたので、躊躇しています。別の方法はありますか?それとも、これを処理する最も簡単で最良の方法は公開することですか?

コードは次のとおりです。

書籍

public class books {

private int bookID;
private String title;
private String author;


public books() {
}

public books(int bookID, String title, String author) {
    this.bookID = bookID;
    this.title = title;
    this.author = author;
}

public int getBookID() {
    return bookID;
}

public void setBookID(int bookID) {
    this.bookID = bookID;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}


public String addSpaces(String s, int w) {
    String spc = "";
    for (int i = 1; i <= (w - s.length()); i++) {
        spc = spc + " ";
    }
    return spc;
}

public class AllBooks extends books{
private String genre;
private String status;
private String Location;
private String condition;

すべての本

public AllBooks(int bookID, String title, String author, String genre, String status, String Location, String condition ) {
    super(bookID, title, author);
    this.genre = genre;
    this.status = status;
    this.Location = Location;
    this.condition = condition;
}

public String getGenre() {
    return genre;
}

public void setGenre(String genre) {
    this.genre = genre;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getLocation() {
    return Location;
}

public void setLocation(String Location) {
    this.Location = Location;
}

public String getCondition() {
    return condition;
}

public void setCondition(String condition) {
    this.condition = condition;
}



    @Override
public String toString() {
    String stg = "";
    stg = stg + bookID + '\t' + title + addSpaces(title, 30) + author + addSpaces(author, 30) + genre + addSpaces(genre, 15) + status + addSpaces(status, 5) + Location + addSpaces(Location, 20) + condition;
    return stg;
}

    public String toString(int i){
    String stg = "";
    stg += bookID + "#" + title + "#" + author + "#" + genre + "#" + status + "#" + Location + "#" + condition + "#";
    return stg;
}

PS

これがばかげた質問であれば申し訳ありません。これは学校のプロジェクトであり、私が今行っている休暇の後に期限があるため、先生に尋ねない理由です. オンラインで答えを確認しましたが、私が出会ったチュートリアルではエチケットについてあまり言及されていませんでした. ご協力いただきありがとうございます。お時間を無駄にして申し訳ありません。

4

3 に答える 3

6

既存のパブリック アクセサーを使用します。たとえばgetBookID()、スーパークラスのプライベート フィールドに直接アクセスしようとするのではなく、サブクラスで使用します。

@Override
public String toString() {
    String stg = getBookID() + '\t' + getTitle() 
        + addSpaces(title, 30) + getAuthor() 
        + addSpaces(author, 30) + getGenre() 
        + addSpaces(genre, 15) + getStatus() 
        + addSpaces(status, 5) + getLocation() 
        + addSpaces(Location, 20) + getCondition();
    return stg;
}

別の方法は、フィールドを作成することprotectedです。ただし、これにより、潜在的に任意の数のサブクラスをスーパークラスの表現に直接結合することができます。通常は、メソッドの背後にあるデータをカプセル化することをお勧めします。

ちなみに、String.format()が便利だと思うかもしれません。構文については、フォーマット文字列の構文を参照してください。

于 2013-07-16T15:49:56.640 に答える
1

bookID のゲッターが既にあるので、それを他のクラスで使用することはできませんか。たとえば、次のようになります。

System.out.println(books.getBookID());
于 2013-07-16T15:52:41.690 に答える
0

Andy Thomas が指摘したように、パブリック メソッドを直接使用してアクセスできます。パブリック メソッドは、実際にはプライベート変数をカプセル化しています。

それでも直接使用する必要がある場合は、保護する必要があります。これは、それを拡張するクラスのみがアクセスできることを意味します。

于 2013-07-16T15:55:58.427 に答える