Здравствуйте, Kswapd, Вы писали:
_NN>>А чем интерфейс не чистый ?
_NN>>В любом случае определить метод никто не запрещает.
K>Тем, что может содержать не только абстрактные функции. А возможность определения дефолтных методов сводит интерфейс к банальному классу, как в C++. Нарушается чистота дизайна, абстракции "протекают". Наследование реализации вообще зло.
Основная проблема это наследование состояния, а его в интерфейсе нет.
Не хотите реализацию по умолчанию, переопределяйте все методы по старинке. Никто не запрещает.
Разве нелогично иметь реализацию по умолчанию для некоторых методов ?
Например:
interface Comparable<T>
{
boolean lessThan(T left, T right) { return !equalsTo(left, right) && !greaterThan(left, right); }
boolean greaterThan(T left, T right) { return !equalsTo(left, right) && !lessThan(left, right); }
boolean equalsTo(T left, T right) { return !lessThan(left, right) && !greaterThan(left, right); }
}
Кстати, методы расширения тоже нарушают чистоту ?
interface MyInterface { int G(); }
static class InterfaceExtensions
{
public static int F(this MyInterface i) { return i.G() + 1; }
}
// ...
MyInterface i;
i.F();