Интерфейс не является абстрактным классом .
Интерфейсы необходимы для определения общего протокола между классами, где общий протокол означает только сигнатуры методов, которые видимы из других классов, и то, что они способны делать. Интерфейсы не могут «удерживать» значения.
Абстрактные классы более мощные, они используются для определения общей части между классами, либо procol, либо реализацией. Вы можете смешивать предопределенное поведение с абстрактными методами и позволять подклассам реализовывать их.
Что это значит?
Это означает, что вы используете интерфейс, когда хотите дать своим классам те же методы, но если вы хотите определить общее поведение, вы должны использовать абстрактный класс или класс отца, из которого объявляются конкретные реализации.
В вашем примере вы можете позволить типу класса быть вашим фактическим типом операции:
interface ArithmeticOperation
{
public double operate(double a, double b);
}
class AddOperation implements ArithmeticOperation
{
public double operate(double a, double b)
{
return a + b;
}
}
Вы также можете использовать подклассы для определенных вещей (учтите, что следующий пример тривиален и не очень подходит):
class PowerOperation implements UnaryOperation
{
public double operate(double a)
{
return a*a;
}
}
class CubeOperation extends PowerOperation
{
public double operate(double a)
{
return super.operate(a)*a;
}
}
Вам следует избегать цепочки IFs просто для распечатки вещей, потому что ваши классы уже знают, какого они типа, и вы можете делегировать им эту работу:
class AddOperation{ public String printVal() { return "ADD"; } }
class SubOperation{ public String printVal() { return "SUB"; } }