Подтвердить что ты не робот

Что "реализует" делать на классе?

Если класс реализует другой класс... что это значит? Я нашел этот пример кода: http://www.java2s.com/Code/Php/Class/extendsandimplement.htm

Но, к сожалению, у него нет никаких объяснений...

4b9b3361

Ответ 1

Реализует означает, что он принимает заданное поведение, указанное интерфейсом. Рассмотрим следующий интерфейс:

public interface ISpeak
{
   public String talk();
}

public class Dog implements ISpeak
{
   public String talk()
   {
        return "bark!";
   }
}

public class Cat implements ISpeak
{
    public String talk()
    {
        return "meow!";
    }
}

Оба класса Cat и Dog реализуют интерфейс ISpeak.

Что отличает интерфейс, так это то, что теперь мы можем ссылаться на экземпляры этого класса через интерфейс ISpeak. Рассмотрим следующий пример:

  Dog dog = new Dog();
  Cat cat = new Cat();

  List<ISpeak> animalsThatTalk = new ArrayList<ISpeak>();

  animalsThatTalk.add(dog);
  animalsThatTalk.add(cat);

  for (ISpeak ispeak : animalsThatTalk)
  {
      System.out.println(ispeak.talk());
  }

Выход для этого цикла будет:

кора!
мяу!

Интерфейс предоставляет средство для взаимодействия с классами в общем виде на основе того, что они делают, не подвергая действию классы реализации.

Одним из наиболее распространенных интерфейсов, используемых в Java, является Comparable. Если ваш объект реализует этот интерфейс, вы можете написать реализацию, которую потребители могут использовать для сортировки ваших объектов.

Например:

public class Person implements Comparable<Person>
{
  private String firstName;
  private String lastName;

  // Getters/Setters

  public int compareTo(Person p)
  {
    return this.lastName.compareTo(p.getLastName());  
  }
}

Теперь рассмотрим этот код:

//  Some code in other class

List<Person> people = getPeopleList();

Collections.sort(people);

Что сделал этот код, это естественный порядок в классе Person. Поскольку мы реализовали интерфейс Comparable, нам удалось использовать метод Collections.sort() для сортировки наших List объектов Person по его естественному порядку, в данном случае по фамилии.

Ответ 2

Вы должны изучить интерфейсы Java. Быстрый поиск Google показал эту страницу, которая выглядит довольно хорошо.

Мне нравится думать о interface как о "обещании": любой класс, который его реализует, имеет определенное поведение, которое можно ожидать от него, и поэтому вы можете поместить экземпляр класса реализации в интерфейс - тип ссылки.

Простым примером является интерфейс java.lang.Comparable. Используя все методы в этом интерфейсе в своем классе, вы утверждаете, что ваши объекты "сопоставимы" друг с другом и могут быть частично упорядочены.

Реализация интерфейса требует двух шагов:

  • Объявление о том, что интерфейс реализован в объявлении класса
  • Предоставление определений для ВСЕХ методов, которые являются частью интерфейса.

Интерфейс java.lang.Comparable имеет только один метод, public int compareTo(Object other). Поэтому вам необходимо предоставить этот метод.

Вот пример. Учитывая этот класс RationalNumber:

public class RationalNumber
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }
}

(Примечание. Как правило, на практике Java имеет публичные поля, но я предполагаю, что это очень простой тип данных с обычным старым типом, поэтому мне не нужны публичные поля!)

Если я хочу сравнить два экземпляра RationalNumber (для сортировки, может быть?), я могу это сделать, реализовав интерфейс java.lang.Comparable. Для этого необходимо сделать две вещи: предоставить определение для compareTo и объявить, что интерфейс реализован.

Вот как выглядел класс fleshed-out:

public class RationalNumber implements java.lang.Comparable
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }

    public int compareTo(Object other)
    {
        if (other == null || !(other instanceof RationalNumber))
        {
            return -1; // Put this object before non-RationalNumber objects
        }

        RationalNumber r = (RationalNumber)other;

        // Do the calculations by cross-multiplying. This isn't really important to
        // the answer, but the point is we're comparing the two rational numbers.
        // And no, I don't care if it mathematically inaccurate.

        int myTotal = this.numerator * other.denominator;
        int theirTotal = other.numerator * this.denominator;

        if (myTotal < theirTotal) return -1;
        if (myTotal > theirTotal) return 1;
        return 0;
    }
}

Вероятно, вы думаете, в чем смысл всего этого? Ответ заключается в том, когда вы смотрите на такие методы, как this: алгоритмы сортировки, которые просто ожидают "какого-то сопоставимого объекта". (Обратите внимание на то, что все объекты должны реализовывать java.lang.Comparable!). Этот метод может принимать списки любого типа сопоставимых объектов, будь то String или Integer или RationalNumber s.

ПРИМЕЧАНИЕ. В этом ответе я использую методы Java 1.4. java.lang.Comparable теперь является общим интерфейсом, но у меня нет времени для объяснения дженериков.

Ответ 3

Интерфейсы реализуются через классы. Это чисто абстрактные классы, если хотите.

В PHP, когда класс реализует интерфейс, методы, определенные в этом интерфейсе, должны строго соблюдаться. Когда класс наследуется от родительского класса, параметры метода могут быть изменены. Это не относится к интерфейсам:

interface ImplementMeStrictly {
   public function foo($a, $b);
}

class Obedient implements ImplementMeStrictly {
   public function foo($a, $b, $c) 
      {
      }
}

приведет к ошибке, поскольку интерфейс не был реализован так, как определено. Принимая во внимание:

class InheritMeLoosely {
   public function foo($a)
      {
      }
}

class IDoWhateverWithFoo extends InheritMeLoosely {
   public function foo()
      {
      }
}

Разрешено.

Ответ 4

Интерфейс можно рассматривать как просто список определений методов (без какого-либо тела). Если класс хочет реализовать и интерфейс, он заключает контракт, заявив, что он предоставит реализацию для всех методов, перечисленных в интерфейсе. Для получения дополнительной информации см. http://download.oracle.com/javase/tutorial/java/concepts/

Ответ 5

В Java класс может реализовать интерфейс. Подробнее см. http://en.wikipedia.org/wiki/Interface_(Java). Не уверен в PHP.

Надеюсь, что это поможет.

Ответ 6

Интерфейс определяет простой договор методов, который должны реализовывать все реализующие классы. Когда класс реализует интерфейс, он должен предоставлять реализации для всех своих методов.

Я предполагаю, что плакат предполагает определенный уровень знания языка.

Ответ 7

Он называется интерфейсом. Многие языки OO имеют эту функцию. Вы можете прочитать объяснение php здесь: http://de2.php.net/interface