Доброго дня всем. Начал изучать такую интересную тему как интерфейсы. Некоторые задачи выполняются чисто интуитивно, но не совсем понятно как что работает. Ниже выкладываю код программы, которая успешно прошла проверку на сервере.
/* Исправление ошибок
1. Переделай наследование в классах и интерфейсах так, чтобы программа компилировалась и продолжала делать то же самое.
2. Класс Hobbie должен наследоваться от интерфейсов Desire, Dream.
*/
public class Solution
{
public static void main(String[] args) throws Exception
{
System.out.println(Dream.HOBBIE.toString());
System.out.println(new Hobbie().INDEX);
}
interface Desire
{
}
interface Dream //implements Hobbie
{
static Hobbie HOBBIE = new Hobbie();
}
static class Hobbie implements Desire, Dream
{
static int INDEX = 1;
@Override
public String toString()
{
INDEX++;
return "" + INDEX;
}
}
}
Хотелось бы описать как я понимаю её, но мысли очень разбросаны. Не могли бы вы в 2х словах описать работу данной программы, а именно что происходит в этом интерфейсе:
interface Dream //implements Hobbie
{
static Hobbie HOBBIE = new Hobbie();
}
Спасибо.
Мечты и желания порождают Хобби.
В интерфейсе Dream создаются два объекта в памяти:
1) класс Hobbie, у которого есть переменная INDEX=1
2) экземпляр класса Hobbie (то есть собственно объект от класса
Hobbie), у которого есть метод toString(), но переменная INDEX не принадлежит ему, хотя объект и имеет доступ к ней.
и вызывая
мы увеличиваем значение переменной класса INDEX (было 1 стало 2).
Второй вывод в консоль
создает другой объект Hobbie и через него получит значение переменной класса INDEX (равное 2)
Если бы написали вместо
выражение
то вывело бы INDEX=3, так как был бы вызван метод объекта, который увеличивает значение переменной класса.
Очень рекомендую скачать\купить книгу www.ozon.ru/context/detail/id/31079082/
Там самая первая большая глава посвящена интерфейсам и более реальным их применениям.
А в интерфейсе Profit создается:
экземпляр класса GiveMilk со своим набором примитивных переменных: Молоко в месяц, Густота, Вкуснота…
экземпляр класса GiveEgg с другим набором переменных: Яйца в день, Множество (Set) типы яиц, Общее кол-во яиц
экземпляр класса GiveGuano с набором: Множество (Set) тип гуано, double Кол-во в день.
Например добавляя или удаляя корову вы модифицируете экземпляры класса GiveGuano и GiveMilk,
а если вылупился птенчик — то уменьшаете Общее кол-во яиц и GiveGuano
Почему классы, а не переменные — потому что методы более гибко реализуют поведение животного/птицы по мере взросления и т.п.
И классы созданные в интерфейсе характеризуют единственное последнее актуальное состояние вашей фермы, при этом у вас только животные, нет объектов ферма, глобальных переменных и других левых сущностей.
Фактически такой вот вариант Singleton-а реализованный в интерфейсе и растворенный в созданном в нем единственном (по определению класс и его переменные) экземпляре.
Возьмите и делайте параллельно небольшую задачу.
Для примера:
есть 3 типа воинов: берсерк, лучник и пехотинец. У них пусть по 3 разных подтипа поведения (интерфейса) и частично пересекающиеся свойства(здоровье, кол-во стрел, скорость, кол-во грибов).
Наберите 2 войска из разных типов воинов и столкните между собой, выводя в консоль шаги битвы + введите частичную зависимость выбора действий воинов от random-а.
Поле битвы — Singleton, а вот войско можно реализовывать по разному в объектной модели.
Напишите код таким образом, чтобы если понадобится расширить функционал, например увеличить кол-во противоборствующих войск, добавить новый тип воина (лекарь) или тип поведения (оцепенение-пауза) — можно было это сделать внося минимальные порции кода.
или другие задачи придумайте. Пробуйте (если есть время).
Содержит физическую карту (пусть банальный двумерный массив).
При обращении к нему конкретного воина выдает в зависимости от его обзорности и текущей позиции кусочек этой карты с расположенными на нем войсками.
Расставляет начальное расположение войск.
Определяет исход битвы — например не осталось войск противоположной стороны — завершает битву.
и т.п.