Skip to main content

Демонстрация на музикални инструменти (Изключения)

Музикални Инструменти

Цел: Ще използваме абстрактни класове, интерфейси и изключения (exceptions) за да създадем структура, която представя управление на магазин за музикални инструменти.

Задача: Вие трябва да създадете система, която позволява на музикален магазин да демонстрира различни музикални инструменти. Някои инструменти могат да бъдат изпълнени на демо, докато други не. При опит за демонстрация на инструмент, който не може да бъде изпълнен, системата трябва да хвърля грешка.

// Abstract class
// Абстрактният клас позволява да създадем базова структура за обектите.
// Той не може да бъде инстанциран директно, но може да има атрибути и методи, които
// наследниците му трябва да имплементират или да използват така, както са дефинирани.
abstract class MusicalInstrument {
private String name;
private String brand;
private double price;

// Constructor, getters, setters ...
}

// Interface
// Интерфейсите позволяват да дефинираме поведение, което класовете може да имплементират.
// Интерфейсът задължава класовете, които го имплементират, да дефинират методите от интерфейса.
interface Playable {
void play();
}

// Classes
class Guitar extends MusicalInstrument implements Playable {
// Класът Guitar наследява абстрактния клас MusicalInstrument и имплементира интерфейса Playable.
// Това означава, че Guitar притежава характеристиките на MusicalInstrument и е длъжен да предостави
// имплементация на метода play() от интерфейса Playable.
@Override
public void play() {
System.out.println("Playing the guitar!");
}
}

class Drum extends MusicalInstrument {
// Drum наследява само абстрактния клас и не притежава функционалността на Playable интерфейса.
}

class Piano extends MusicalInstrument implements Playable {
@Override
public void play() {
System.out.println("Playing the piano!");
}
}

// Custom Exception
// Персонализираните изключения ни позволяват да създаваме и хвърляме грешки, които са специфични за приложението ни.
class NotPlayableException extends RuntimeException {
public NotPlayableException(String message) {
super(message);
}
}

class MusicShop {
public void demoInstrument(MusicalInstrument instrument) {
// instanceof е оператор в Java, който проверява дали даден обект е инстанция на конкретен клас или интерфейс.
if(instrument instanceof Playable) {
// Тук кастваме обекта до Playable, за да извикаме метода play().
((Playable) instrument).play();
} else {
// Хвърляме нашето персонализирано изключение, ако инструментът не може да бъде изпълнен на демо.
throw new NotPlayableException("This instrument can't be played for a demo!");
}
}
}

public class Main {
public static void main(String args[])
{
try {
// Създаваме нов инструмент от тип Guitar
Guitar g = new Guitar();

// Създаваме нов магазин за музикални инструменти
MusicShop ms = new MusicShop();

// Демонстрираме как звучи китарата
ms.demoInstrument(g);

// Създаваме нов инструмент от тип Drum
Drum d = new Drum();

// Опитваме да демонстрираме барабана, но той не имплементира Playable интерфейса, затова ще бъде хвърлена грешка NotPlayableException
ms.demoInstrument(d);
}
catch(NotPlayableException e)
{
// Извеждаме съобщението на хвърленото изключение
System.out.println(e.getMessage());
}
}
}

Когато изпълните главната функция, трябва да видите демонстрация на звука на китарата и след това грешка, която уведомява, че барабанът не може да бъде изпълнен на демо. 🎵🚫