Если класс реализует другой класс... что это значит? Я нашел этот пример кода: 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