diff --git a/oop_basics/book.js b/oop_basics/book.js new file mode 100644 index 0000000..3f90c88 --- /dev/null +++ b/oop_basics/book.js @@ -0,0 +1,49 @@ +export default class Book { + constructor(title, author, releaseYear) { + this._title = title; + this._author = author; + this._releaseYear = releaseYear; + } + + get title() { + return this._title; + } + + set title(newTitle) { + if (typeof newTitle !== 'string' || newTitle.trim() === '') { + throw new Error('Invalid input. Title must be a non-empty string.'); + } + this._title = newTitle; + } + + get author() { + return this._author; + } + + set author(newAuthor) { + if (typeof newAuthor !== 'string' || newAuthor.trim() === '') { + throw new Error('Invalid input. Author must be a non-empty string.'); + } + this._author = newAuthor; + } + + get releaseYear() { + return this._releaseYear; + } + + set releaseYear(newYear) { + if (typeof newYear !== 'number') { + console.error('Invalid input. Year must be a number.'); + return; + } + this._releaseYear = newYear; + } + + printInfo() { + console.log(`Title: ${this._title}, Author: ${this._author}, Release Year: ${this._releaseYear}`); + } + + static findOldestBook(books) { + return books.reduce((oldest, current) => (oldest.releaseYear < current.releaseYear ? oldest : current)); + } +} \ No newline at end of file diff --git a/oop_basics/eBook.js b/oop_basics/eBook.js new file mode 100644 index 0000000..ae5091a --- /dev/null +++ b/oop_basics/eBook.js @@ -0,0 +1,28 @@ +import Book from './book.js'; + +export default class EBook extends Book { + constructor(title, author, releaseYear, fileFormat) { + super(title, author, releaseYear); + this._fileFormat = fileFormat; + } + + get fileFormat() { + return this._fileFormat; + } + + set fileFormat(newFormat) { + if (typeof newFormat !== 'string' || newFormat.trim() === '') { + throw new Error('Invalid input. File format must be a non-empty string.'); + } + this._fileFormat = newFormat; + } + + printInfo() { + super.printInfo(); + console.log(`File Format: ${this._fileFormat}`); + } + + static createEBookFromBook(bookInstance, fileFormat) { + return new EBook(bookInstance.title, bookInstance.author, bookInstance.releaseYear, fileFormat); + } +} \ No newline at end of file diff --git a/oop_basics/task1.js b/oop_basics/task1.js new file mode 100644 index 0000000..ba302ff --- /dev/null +++ b/oop_basics/task1.js @@ -0,0 +1,21 @@ +import Book from './book.js'; +import EBook from './eBook.js'; + +const book1 = new Book('Title1', 'Author1', 2000); +const book2 = new Book('Title2', 'Author2', 2010); + +const ebook1 = new EBook('E-Title1', 'E-Author1', 2020, 'PDF'); +const ebook2 = new EBook('E-Title2', 'E-Author2', 2021, 'EPUB'); + +book1.printInfo(); +book2.printInfo(); +ebook1.printInfo(); +ebook2.printInfo(); + +const oldestBook = Book.findOldestBook([book1, book2, ebook1, ebook2]); +console.log('Oldest book:'); +oldestBook.printInfo(); + +const newEBook = EBook.createEBookFromBook(book2, 'MOBI'); +console.log('New EBook:'); +newEBook.printInfo(); \ No newline at end of file