public class DemoInterfacce {
    interface Misurabile {
        int valore();

        default boolean supera(int soglia) {
            return valore() > soglia;
        }

        static int differenza(Misurabile primo, Misurabile secondo) {
            return Math.abs(primo.valore() - secondo.valore());
        }
    }

    interface Descrivibile {
        String descrizione();
    }

    record Temperatura(int valore) implements Misurabile, Descrivibile {
        @Override
        public String descrizione() {
            return valore + " gradi";
        }
    }

    static abstract class Contatore implements Misurabile {
        private int valore;

        public void aumenta() {
            valore++;
        }

        @Override
        public int valore() {
            return valore;
        }
    }

    static final class ContatorePrestiti extends Contatore implements Descrivibile {
        @Override
        public String descrizione() {
            return valore() + " prestiti";
        }
    }

    public static void main(String[] args) {
        Temperatura temperatura = new Temperatura(27);
        ContatorePrestiti prestiti = new ContatorePrestiti();
        prestiti.aumenta();
        System.out.println(temperatura.descrizione());
        System.out.println(temperatura.supera(25));
        System.out.println(prestiti.descrizione());
        System.out.println(Misurabile.differenza(temperatura, prestiti));
    }
}
