Пользователь спросил: 'Доработайте программу из лабораторной работы №2. Создайте
интерфейс и используйте его в одном или нескольких классах своего
приложения. Реализуйте для методов, присваивающих значения переменным
(например, сеттерам), модель исключений.
// Абстрактный класс BuildingMaterial
abstract class BuildingMaterial {
    protected String name;
    protected double pricePerUnit;
    protected int quantity;

    public BuildingMaterial(String name, double pricePerUnit, int quantity) {
        this.name = name;
        this.pricePerUnit = pricePerUnit;
        this.quantity = quantity;
    }

    // Абстрактный метод для расчета общей стоимости
    public abstract double calculateTotalCost();

    // Метод для получения информации о материале
    public void displayInfo() {
        System.out.println("Название: " + name);
        System.out.println("Цена за единицу: " + pricePerUnit);
        System.out.println("Количество: " + quantity);
    }
}

abstract class WoodMaterial extends BuildingMaterial {
    public WoodMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }
}

abstract class MetalMaterial extends BuildingMaterial {
    public MetalMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }
}

class Lumber extends WoodMaterial {
    public Lumber(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity;
    }
}


class SteelBeam extends MetalMaterial {
    public SteelBeam(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity * 1.1; // наценка для металлов
    }
}

class ConcreteMaterial extends BuildingMaterial {
    public ConcreteMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity * 0.9; // скидка для бетона
    }
}


public class Lab3 {
    public static void main(String[] args) {
        BuildingMaterial lumber = new Lumber("Пиломатериал", 150.0, 20);
        BuildingMaterial steelBeam = new SteelBeam("Стальная балка", 500.0, 10);
        BuildingMaterial cement = new ConcreteMaterial("Цемент", 100.0, 30);

        // Вывод информации
        lumber.displayInfo();
        System.out.println("Общая стоимость: " + lumber.calculateTotalCost() + "\n");

        steelBeam.displayInfo();
        System.out.println("Общая стоимость: " + steelBeam.calculateTotalCost() + "\n");

        cement.displayInfo();
        System.out.println("Общая стоимость: " + cement.calculateTotalCost());
    }
}'. Ответь четко и ясно на его вопрос.
История беседы:
Пожалуйста, используй обычные математические символы и знаки вместо HTML-форматирования. Например, используй *, /, ^, ≤, ≥, ≠, ∑, ∏, √ и другие символы напрямую.
Доработайте программу из лабораторной работы №2. Создайте
интерфейс и используйте его в одном или нескольких классах своего
приложения. Реализуйте для методов, присваивающих значения переменным
(например, сеттерам), модель исключений.
// Абстрактный класс BuildingMaterial
abstract class BuildingMaterial {
    protected String name;
    protected double pricePerUnit;
    protected int quantity;

    public BuildingMaterial(String name, double pricePerUnit, int quantity) {
        this.name = name;
        this.pricePerUnit = pricePerUnit;
        this.quantity = quantity;
    }

    // Абстрактный метод для расчета общей стоимости
    public abstract double calculateTotalCost();

    // Метод для получения информации о материале
    public void displayInfo() {
        System.out.println("Название: " + name);
        System.out.println("Цена за единицу: " + pricePerUnit);
        System.out.println("Количество: " + quantity);
    }
}

abstract class WoodMaterial extends BuildingMaterial {
    public WoodMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }
}

abstract class MetalMaterial extends BuildingMaterial {
    public MetalMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }
}

class Lumber extends WoodMaterial {
    public Lumber(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity;
    }
}


class SteelBeam extends MetalMaterial {
    public SteelBeam(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity * 1.1; // наценка для металлов
    }
}

class ConcreteMaterial extends BuildingMaterial {
    public ConcreteMaterial(String name, double pricePerUnit, int quantity) {
        super(name, pricePerUnit, quantity);
    }

    @Override
    public double calculateTotalCost() {
        return pricePerUnit * quantity * 0.9; // скидка для бетона
    }
}


public class Lab3 {
    public static void main(String[] args) {
        BuildingMaterial lumber = new Lumber("Пиломатериал", 150.0, 20);
        BuildingMaterial steelBeam = new SteelBeam("Стальная балка", 500.0, 10);
        BuildingMaterial cement = new ConcreteMaterial("Цемент", 100.0, 30);

        // Вывод информации
        lumber.displayInfo();
        System.out.println("Общая стоимость: " + lumber.calculateTotalCost() + "\n");

        steelBeam.displayInfo();
        System.out.println("Общая стоимость: " + steelBeam.calculateTotalCost() + "\n");

        cement.displayInfo();
        System.out.println("Общая стоимость: " + cement.calculateTotalCost());
    }
}