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

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

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

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

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

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 of Person естественным порядком, в данном случае по фамилии.

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

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

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

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

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

Интерфейс 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's 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; } } 

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

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

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

В 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() { } } 

Позволено.

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

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

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

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

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

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