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