Если класс реализует другой класс … что это значит? Я нашел этот пример кода: http://www.java2s.com/Code/Php/Class/extendsandimplement.htm
Но, к сожалению, у него нет никаких объяснений …
Реализует означает, что он принимает заданное поведение , указанное интерфейсом. Рассмотрим следующий интерфейс:
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
. Внедряя все методы в этом интерфейсе в своем классе, вы утверждаете, что ваши объекты «сопоставимы» друг с другом и могут быть частично упорядочены.
Для реализации интерфейса требуется два шага:
Интерфейс 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