Получить имя автора из составного класса Book - PullRequest
2 голосов
/ 20 января 2020

Итак, я новичок в объектно-ориентированном программировании. Я написал код для соединения составного и компонентного классов, мне нужно включить хотя бы один метод, который позволяет составному классу взаимодействовать с компонентным классом для вычисления некоторого значения. Но мой Book класс не показывает имя автора.

Это мой код:

public class Author{

private String name;
private String yearOfBirth;  

    public Author ()
    this.name = null;
    this.yearOfBirth = null;   
    }

    public Author (String aName)
    {
       this.name = aName;
       this.yearOfBirth = null;

   }
    public Author(String aName, String     aYear)
    {
  this.name = aName;
  this.yearOfBirth = aYear;
  }

public void setName(String aName)
  {
  this.name = aName;
 }

 public void setYearOfBirth(String aYear)
  {
  this.yearOfBirth = aYear;
 }

    public String getName()
    {
     return this.name;
     }

    public String getYearOfBirth()
     {
      return this.yearOfBirth;
    }  

public String toString()
{
   return this.name + "(Born " + this.yearOfBirth + ")";
}

КНИЖНЫЙ КЛАСС

public class Book
{

 private String title;
 private String yearPublished;
 private Author author;


 public Book(String aTitle, String aYear,Author theAuthor)
  {
    this.title = aTitle;
    this.yearPublished = aYear;
    this.author = theAuthor;
   }


 public Book(String aTitle)
 {
   this.title = aTitle;
   this.yearPublished = null;
   this.author = new Author();
 }

 public void setAuthorName(String aName)
  {
      this.author.setName(aName);
 } 

  public void setYearPublished(String aYear)
  {
     this.yearPublished = aYear;
    }

     public String getTitle()
  {
     return this.title;   
  }

  public String getYearPublished()
   {
    if (this.yearPublished == null)
    {
       return "Unknown";
     }

     return this.yearPublished;
      }

   public String getAuthorName()
   {
     return this.author.getName();
    }

    public boolean isBorn()
    {
         return(Integer.parseInt
   (this.author.getYearOfBirth()) < 1900);
  }

public String toString()
  {

 {
    return "Title: " + this.title + ", Author: " + this.author.getName() + ", yearPublished: " + this.yearPublished+ ".";          
 } 

Поэтому, когда я пытаюсь получить имя автора, выполнив что-то вроде: Book hp = new Book ("Harry Potter","JK Rowling","2000");, оно говорит в области отображения

Compilation failed (20/01/2020 15:02:12)
Error: line 1 - no suitable constructor found for Book(java.lang.String,java.lang.String,java.lang.String)

Как вы можете видеть, программа не печатает имя автора.

Я ценю всю помощь!

Ответы [ 3 ]

1 голос
/ 20 января 2020

Поскольку вызов вашего строителя бесполезен.

Класс книги ожидает получения заголовка типа String, одного года типа String

и автора типа Author

Пример Book book =new Book("test", "2020", new Author("MyAuthor"));

0 голосов
/ 20 января 2020

Как говорится в сообщении об ошибке, вы не определили конструктор для Book, который принимает три строки, так как вы пытаетесь вызвать его в

Book hp = new Book ("Harry Potter","JK Rowling","2000");

(Как примечание, у вас есть автор и год назад)

У вас есть два варианта здесь.

Сначала вы можете создать автора до , вызывая конструктор Book

Author jkr = new Author("JK Rowling");
Book hp = new Book("Harry Potter", jkr, "2000");

Или вы можете создать новый конструктор внутри Book, который ожидает имя автора в виде строки, создает сам объект автора и затем вызывает его как автора новой книги

public Book(String title, String author, String year) {
    this.title = title;
    this.author = new Author(author);
    this.yearPublished = year;
}

Первая версия имеет то преимущество, что вы можете полностью использовать свой класс Author, например, чтобы установить год рождения автора

Author jkr = new Author("JK Rowling", "1965");
Book hp = new Book("Harry Potter", jkr, "2000");

, без которого вторая версия не позволяет вам обойтись создание другого конструктора, который принимает заголовок, имя автора, год рождения автора, год издания книги.

0 голосов
/ 20 января 2020

Третий параметр, который принимает конструктор книги - это объект автора.

Таким образом, вызов должен быть похож на

Book hp = new Book («Гарри Поттер», 2000, новый Автор («JK Rowling», 1965));

...