Java在线教程

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  如果你知道某个类实现了Relatable接口,你可以比较从这个类实例化的对象了。

  Relatable接口的实现

  下面是一个三角形类,它实现了Relatable接口。

  1.public class RectanglePlus

  2. implements Relatable {

  3. public int width = 0;

  4. public int height = 0;

  5. public Point origin;

  6. // four constructors

  7. public RectanglePlus() {

  8. origin = new Point(0, 0);

  9. }

  10. public RectanglePlus(Point p) {

  11. origin = p;

  12. }

  13. public RectanglePlus(int w, int h) {

  14. origin = new Point(0, 0);

  15. width = w;

  16. height = h;

  17. }

  18. public RectanglePlus(Point p, int w, int h) {

  19. origin = p;

  20. width = w;

  21. height = h;

  22. }

  23. // a method for moving the rectangle

  24. public void move(int x, int y) {

  25. origin.x = x;

  26. origin.y = y;

  27. }

  28. // a method for computing

  29. // the area of the rectangle

  30. public int getArea() {

  31. return width * height;

  32. }

  33. // a method required to implement

  34. // the Relatable interface

  35. public int isLargerThan(Relatable other) {

  36. RectanglePlus otherRect

  37. = (RectanglePlus)other;

  38. if (this.getArea() < otherRect.getArea())

  39. return -1;

  40. else if (this.getArea() > otherRect.getArea())

  41. return 1;

  42. else

  43. return 0;

  44. }

  45.}

  使用接口类型

  在你定义一个新的接口时,你其实在定义一个新的引用类型。在你能使用数据类型名称的地方,都可以使用接口名称。如果你定义了一个类型为接口的引用变量,该变量能指向的对象所在的类必须实现了该接口。

  下例是一个在一对对象中返回较大对象的方法:

  1.public Object findLargest(Object object1, Object object2) {

  2. Relatable obj1 = (Relatable)object1;

  3. Relatable obj2 = (Relatable)object2;

  4. if ((obj1).isLargerThan(obj2) > 0)

  5. return object1;

  6. else

  7. return object2;

  8.}

  通过把数据类型object1转换成Relatable,对象obj1可以调用isLargerThan方法。

  同理,只要是实现了Relatable的类,也可以使用下面的方法。

  1.public Object findSmallest(Object object1, Object object2) {

  2. Relatable obj1 = (Relatable)object1;

  3. Relatable obj2 = (Relatable)object2;

  4. if ((obj1).isLargerThan(obj2) < 0)

  5. return object1;

  6. else

  7. return object2;

  8.}

  9.public boolean isEqual(Object object1, Object object2) {

  10. Relatable obj1 = (Relatable)object1;

  11. Relatable obj2 = (Relatable)object2;

  12. if ( (obj1).isLargerThan(obj2) == 0)

  13. return true;

  14. else

  15. return false;

  16.}

  这些方法适用于任何“Relatable”的类,而无关它们的继承关系。实现了Relatable的类,它们既属于自身(或者父类)的类型,也属于Relatable类型。这使得它们具有了多重继承的优点,因为它们可以同时具备父类和接口的行为。

  重写接口

  假设你开发了一个接口名为DoIt:

  1.public interface DoIt {

  2. void doSomething(int i, double x);

  3. int doSomethingElse(String s);

  4.}

  然后,你想加入一个新的方法在这个接口里,因此代码变成:

  1.public interface DoIt {

  2. void doSomething(int i, double x);

  3. int doSomethingElse(String s);

  4. boolean didItWork(int i, double x, String s);

  5.}

  如果你这么修改了,所有实现了旧的DoIt接口的类都会出错,因为它们不再正确的实现这个接口。所有使用这个接口的程序员会严重抗议你的修改。

  你需要预估你的接口用户的需求,并从开始就完善的设计好这个接口。但是这常常是无法做到的。另一个解决方法就是再写一个接口。例如,你可以写一个DoItPlus的接口继承原有的接口。

  1.public interface DoItPlus extends DoIt {

  2. boolean didItWork(int i, double x, String s);

  3.}

  现在你的用户可以选择继续使用旧接口DoIt,或是升级的新接口DoItPlus。

  总结

  接口就是两个对象间的沟通协议。

  一个接口的声明包含一些方法的签名(signatures),但不需要实现它们;也可能含有一些常量。

  实现某接口的类必须实现该接口所声明的所有的方法。

  在任何使用类型名称的地方都可以使用接口的名字。

[1][2]

耿耿于怀着过去和忐忑不安着未来的人,也常常挥霍无度着现在。

Java在线教程

相关文章:

你感兴趣的文章:

标签云: