Как вывести в консоль информацию об объектах
Подскажите как вывести в консоль информацию о песне и подкасте, это тема связана с полиморфизмом. Задание вроде легкое, но не пойму как правильно записать код в // выведите в консоль информацию о песне/подкасте.
Необходимо описать функцию с параметром audioList, который будет массивом. Циклом forEach проходим по массиву и вызываем на каждом объекте метод получения информации согласно его типу: getSongInfo или getEpisodeInfo.
class AudioItem {
constructor(title, artist) {
this._title = title;
this._artist = artist;
this.isLiked = false;
}
like() {
this.isLiked = !this.isLiked;
}
}
class Song extends AudioItem {
constructor(title, artist, releaseYear) {
super(title, artist);
this._releaseYear = releaseYear;
}
getSongInfo() {
return `${this._artist} - ${this._title} (${this._releaseYear})`
}
}
class PodcastEpisode extends AudioItem {
constructor(title, artist, guest, duration) {
super(title, artist);
this._guest = guest;
this._duration = duration;
}
getEpisodeInfo() {
return `${this._artist}. "${this._title}" - ${this._guest} (${this._getFormattedDuration()} сек.)`;
}
_getFormattedDuration() {
const minutes = Math.floor(this._duration / 60); // целое количество минут
const seconds = this._duration % 60; // остаток от деления на 60
return `${minutes}:${seconds > 9 ? seconds : '0' + seconds}`;
}
}
const song1 = new Song("Tendinitis", "Jason Richardson");
const song2 = new Song("All I Want", "A Day To Remember");
const episode1 = new PodcastEpisode("Одинокий пират", "ЧКГ PODCAST", "Кирилл Сиэтлов", 4987);
const episode2 = new PodcastEpisode("Один день", "Заварили бизнес", null, 1915);
const list = [song1, episode1, song2, episode2];
function getAudioInfo(audioList) {
audioList.forEach((audioItem) => {
if (audioItem.getSongInfo) {
// выведите в консоль информацию о песне
} else if (audioItem.getEpisodeInfo) {
// выведите в консоль информацию о подкасте
}
});
}
getAudioInfo(list);
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Можно в базовом классе создать функцию getInfo(){}, а в функциях наследниках переопределять эту функцию.
Вот простейший пример:
class AudioItem {
constructor(title, artist) {
this._title = title;
this._artist = artist;
this.isLiked = false;
}
like() {
this.isLiked = !this.isLiked;
}
getInfo(){}
}
class Song extends AudioItem {
constructor(title, artist, releaseYear) {
super(title, artist);
this._releaseYear = releaseYear;
}
//Переопределяем функцию
getInfo() {
return `${this._artist} - ${this._title} (${this._releaseYear})`
}
}
class PodcastEpisode extends AudioItem {
constructor(title, artist, guest, duration) {
super(title, artist);
this._guest = guest;
this._duration = duration;
}
//Переопределяем функцию
getInfo() {
return `${this._artist}. "${this._title}" - ${this._guest} (${this._getFormattedDuration()} сек.)`;
}
_getFormattedDuration() {
const minutes = Math.floor(this._duration / 60); // целое количество минут
const seconds = this._duration % 60; // остаток от деления на 60
return `${minutes}:${seconds > 9 ? seconds : '0' + seconds}`;
}
}
const song1 = new Song("Tendinitis", "Jason Richardson", 2016);
const song2 = new Song("All I Want", "A Day To Remember", 2010);
const episode1 = new PodcastEpisode("Одинокий пират", "ЧКГ PODCAST", "Кирилл Сиэтлов", 4987);
const episode2 = new PodcastEpisode("Один день", "Заварили бизнес", null, 1915);
const list = [song1, episode1, song2, episode2];
function getAudioInfo(audioList) {
audioList.forEach((audioItem) => {
//Выводим информацию о каждом элементе
console.log(audioItem.getInfo());
});
}
getAudioInfo(list);
P.S. вы забыли передавать в конструктор Song год, я добавил :)