|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Чтобы объявить class, который реализует интерфейс, Вы включаете implements пункт в объявлении class. Ваш class может реализовать больше чем один интерфейс, таким образом, implements ключевое слово сопровождается списком разделенных запятой значений интерфейсов, реализованных class. Условно, implements пункт следует extends пункт, если есть тот.
Рассмотрите интерфейс, который определяет, как сравнить размер объектов.
public interface Relatable {
// this (object calling isLargerThan)
// and other must be instances of
// the same class returns 1, 0, -1
// if this is greater // than, equal
// to, or less than other
public int isLargerThan(Relatable other);
}
Если Вы хотите быть в состоянии сравнить размер подобных объектов, независимо от того каковы они, class, который инстанцирует их, должен реализовать Relatable.
Любой class может реализовать Relatable если есть некоторый способ сравнить относительный "размер" объектов, которые инстанцируют от class. Для строк это могло быть число символов; для книг это могло быть число страниц; для студентов это мог быть вес; и т.д. Для планарных геометрических объектов областью был бы хороший выбор (см. RectanglePlus class, который следует), в то время как объем работал бы на трехмерные геометрические объекты. Все такие классы могут реализовать isLargerThan() метод.
Если Вы знаете, что class реализует Relatable, тогда Вы знаете, что можно сравнить размер объектов, которые инстанцируют от того class.
Вот Rectangle class, который был представлен в разделе Объектов Создания, переписанном, чтобы реализовать Relatable.
public class RectanglePlus
implements Relatable {
public int width = 0;
public int height = 0;
public Point origin;
// four constructors
public RectanglePlus() {
origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
origin = p;
}
public RectanglePlus(int w, int h) {
origin = new Point(0, 0);
width = w;
height = h;
}
public RectanglePlus(Point p, int w, int h) {
origin = p;
width = w;
height = h;
}
// a method for moving the rectangle
public void move(int x, int y) {
origin.x = x;
origin.y = y;
}
// a method for computing
// the area of the rectangle
public int getArea() {
return width * height;
}
// a method required to implement
// the Relatable interface
public int isLargerThan(Relatable other) {
RectanglePlus otherRect
= (RectanglePlus)other;
if (this.getArea() < otherRect.getArea())
return -1;
else if (this.getArea() > otherRect.getArea())
return 1;
else
return 0;
}
}
Поскольку RectanglePlus реализации Relatable, размер любых двух RectanglePlus объекты могут быть сравнены.
isLargerThan метод, как определено в Relatable интерфейс, берет объект типа Relatable. Строка кода, показанного полужирным в предыдущем примере, бросках other к a RectanglePlus экземпляр. Преобразование типа говорит компилятор, каков объект действительно. Вызов getArea непосредственно на other экземпляр (other.getArea()) был бы не в состоянии скомпилировать, потому что компилятор не понимает это other фактически экземпляр RectanglePlus.