Java -практика использования

        

Использование интерфейса



Листинг 3.3. Использование интерфейса для организации полиморфизма

interface Voice{

void voice();

}



class Dog implements Voice{

  public void voice (){

    System.out.println("Gav-gav!");

  } 

}

class Cat implements Voice{

  public void voice (){

    System.out.println("Miaou!");

  } 

}

class Cow implements Voice{ 

  public void voice(){

    System.out.println("Mu-u-u!");
 

  }

}

public class Chorus{

  public static void main(String[] args){ 

    Voiced singer = new Voice[3]; 

    singer[0] = new Dog();
 

    singer[1] = new Cat();
 

    singer[2] = new Cow();
 

    for(int i = 0; i < singer.length; i++)

      singer[i].voice();

  }

}

Здесь используется интерфейс voice вместо абстрактного класса Pet , описанного в листинге 2.2.

Что же лучше использовать: абстрактный класс или интерфейс? На этот вопрос нет однозначного ответа.

Создавая абстрактный класс, вы волей-неволей погружаете его в иерархию классов, связанную условиями одиночного наследования и единым предком — классом object . Пользуясь интерфейсами, вы можете свободно проектировать систему, не задумываясь об этих ограничениях.

С другой стороны, в абстрактных классах можно сразу реализовать часть методов. Реализуя же интерфейсы, вы обречены на скучное переопределение всех методов.

Вы, наверное, заметили и еще одно ограничение: все реализации методов интерфейсов должны быть открытыми, public , поскольку при переопределении можно лишь расширять доступ, а методы интерфейсов всегда открыты.

Вообще же наличие и классов, и интерфейсов дает разработчику богатые возможности проектирования. В нашем примере, вы можете включить в хор любой класс, просто реализовав в нем интерфейс voice .

Наконец, можно использовать интерфейсы просто для определения констант, как показано в листинге 3.4.



Содержание раздела