From Gossip@Openhome

Java Gossip: ¤¶­±¡]interface¡^«¬ºA

ªí­±¤W¬Ý¨Ó¡A¤¶­±¦³ÂI¹³¬O§¹¥þ¨S¦³¥ô¦ó¤èªk³Q¹ê§@ªº©â¶HÃþ§O¡A¦ý¹ê»Ú¤W¨âªÌ¦b»y¸q»PÀ³¥Î¤W¬O¦³®t§Oªº¡C¡uÄ~©Ó¬Y©â¶HÃþ§OªºÃþ§O¥²©w¬O¸ÓÃþ§Oªº¤@­Ó¤lÃþ¡v¡A¥Ñ©ó¦PÄݤ@­ÓÃþ«¬¡A¥u­n¤÷Ãþ§O¤¤¤]¦³©w¸q¦P¦W¤èªk¡A±z´N¥i¥H³z¹L¤÷Ãþ§O«¬ºA¨Ó¾Þ§@¤lÃþ¹ê¨Ò¤¤³Q­«·s©w¸qªº¤èªk¡A¤]´N¬O³z¹L¤÷Ãþ§O«¬ºA¶i¦æ¦h«¬¾Þ§@¡A¦ý¡u¹ê§@¬Y¤¶­±ªºÃþ§O¨Ã¤£³QÂkÄÝ©ó­þ¤@Ãþ¡v¡A¤@­Óª«¥ó¤W¥i¥H¹ê§@¦h­Ó¤¶­±¡C

¦Ò¼{±z¦³¤@­Ó¤èªkdoRequest()¡A±z¨Æ¥ý¨ÃµLªkª¾¹D¤°»ò«¬ºAªºª«¥ó·|³Q¶Ç¶i¨Ó¡A©ÎªÌ¬O³o­Ó¤èªk¥i¥H±µ¨ü¥ô¦óÃþ«¬ªºª«¥ó¡A±z·Q­n¾Þ§@ª«¥ó¤Wªº¬Y­Ó¯S ©w¤èªk¡A¨Ò¦pdoSomething()¤èªk¡A°ÝÃD¬O¶Ç¶i¨Óªºª«¥ó¬O¥ô·Nªº¡A°£«D±z©w¸q¤@­Ó©â¶HÃþ§O¨Ã«Å§idoSomething()©â¶H¤èªk¡AµM«áÅý©Ò ¦³ªºÃþ§O³£Ä~©Ó³o­Ó©â¶HÃþ§O¡A§_«hªº¸Ü±zªºdoRequest()¤èªk¦ü¥GµLªk¹ê§@¥X¨Ó¡A¹ê»Ú¤W³o»ò§@¤]¨S¦³»ù­È¡C

¤¶­±ªº¥Øªº¦b©w¸q¤@²Õ¥i¾Þ§@ªº¤èªk¡A¹ê§@¬Y¤¶­±ªºÃþ§O¥²¶·¹ê§@¸Ó¤¶­±©Ò©w¸qªº©Ò¦³¤èªk¡A¥u­nª«¥ó¦³¹ê§@¬Y­Ó¤¶­±¡A´N¥i¥H³z¹L¸Ó¤¶­±¨Ó¾Þ§@ª«¥ó¤W¹ïÀ³ªº¤èªk¡AµL½×¸Óª«¥ó¹ê»Ú¤WÄÝ©ó­þ¤@­ÓÃþ§O¡A¹³¤W¤@¬q©Ò­z¤Îªº°ÝÃD¡A´N­n¾a­n¤¶­±¨Ó¸Ñ¨M¡C

¤¶­±ªº«Å§i¬O¨Ï¥Î"interface"ÃöÁä¦r¡A«Å§i¤è¦¡¦p¤U¡G
interface ¤¶­±¦WºÙ {
    ¶Ç¦^«¬ºA ¤èªk(°Ñ¼Æ¦C);
    ¶Ç¦^«¬ºA ¤èªk(°Ñ¼Æ¦C);

    // ....
}

¤@ ­Ó«Å§i¤¶­±ªº¨Ò¤l¦p¤U¡G

  • IRequest.java
public interface IRequest {
public void execute();
}

¤¶­±ªº¤èªkÅv­­¹w³]³£¬O"public"¡A©Ò¥H§Y¨Ï¤èªk«Å§i®É¤£«ü©wpublic¤´¬O¹w³]¬°public¡A¨Ò¦p¤U¨Ò»P¤W¨Ò¬O¬Û¦Pªº¡G
  • IRequest.java
public interface IRequest {
void execute();
}

¤¶­±¹w³]³£¬Oabstract¡A¦³µL¥[abstract³£¤@¼Ë¡A¥H¤Uªº«Å§i§@¥Î¤]¬O¬Û¦P¡G
  • IRequest.java
public abstract interface IRequest {
public abstract void execute();
}


·í©w¸qÃþ§O®É¡A¥i¥H¨Ï¥Î"implements"ÃöÁä¦r¨Ó¤@¨Ö«ü©w­n¹ê§@­þ­Ó¤¶­±¡A¤¶­±¤¤©Ò¦³©w¸qªº¤èªk³£­n¹ê§@¡A¨Ò¦p¡G
  • HelloRequest.java
public class HelloRequest implements IRequest {
private String name;

public HelloRequest(String name) {
this.name = name;
}

public void execute() {
System.out.printf("Hello! %s!%n", name);
}
}

  • WelcomeRequest.java
public class WelcomeRequest implements IRequest {
private String place;

public WelcomeRequest(String place) {
this.place = place;
}

public void execute() {
System.out.printf("Welcome to %s!%n", place);
}
}

¥Ñ©ó¤¶­±¤¤ªº¤èªk¹w³]³£¬Opublic¡A©Ò¥H¹ê§@¤¶­±ªºÃþ§O¤¤¡A¤èªk¥²¶·«Å§i¬°public¡A§_«hµLªk³q¹L½sĶ¡C

¨Ó¼g¤@­Ó´ú¸Õµ{¦¡¡G

  • Test.java
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
int n = (int) (Math.random() * 10) % 2;
switch (n) {
case 0:
doRequest(
new HelloRequest("caterpillar"));
break;
case 1:
doRequest(new WelcomeRequest("PmWiki"));
}
}
}

public static void doRequest(IRequest request) {
request.execute();
}
}

¦b³o­Óµ{¦¡¤¤¡A§Y¨ÏdoRequest()¨Ã¤£ª¾¹D¶Ç¤Jªºª«¥ó¬O­þ¤@ºØÃþ§Oªº¹ê¨Ò¡A¦ý¥¦¥u­nª¾¹D³o­Óª«¥óªº¾Þ§@¤¶­±´N¥i¥H¥¿½Tªº°õ¦æ½Ð¨D¡A³o¬O¤¶­±¹ê§@ªº¤@­Ó¹ê»ÚÀ³¥Î¡A¤]¬O«Ü±`¨£¨ìªº¤@ºØÀ³¥Î¡C

¦bC++¤¤¥i¥H¨Ï¥Î¦h­«Ä~©Ó¡A¦ý¦bJava¤¤¥u¯à³æ¤@Ä~©Ó¡A¤]´N¬O¤@¦¸¥u¯àÂX¥R¤@­ÓÃþ§O¡AJava¨Ï¥Îinterface¨Ó¹F¨ì¬Y¨Ç¦h­«Ä~©Óªº¥Øªº¡A±z¥i ¥H¤@¦¸¹ê§@¦h­Ó¤¶­±¡A´N¹³¬O¦P®ÉÄ~©Ó¦h­Ó©â¶HÃþ§O¡]¹ê»Ú¤W³o¬OC++¤¤¦h­«Ä~©Óªº¤@­Ó¹ê»Ú¹B¥Î¤è¦¡¡^¡A¹ê§@¦h­Ó¤¶­±ªº¤è¦¡¦p¤U¡G
public class Ãþ§O¦WºÙ implements ¤¶­±1, ¤¶­±2, ¤¶­±3 {
    // ¤¶­±¹ê§@
}

·í±z¹ê§@¦h­Ó¤¶­±®É¡A°O±o±z¥²¶·¹ê§@¨C¤@­Ó¤¶­±¤¤©Ò©w¸qªº¤èªk¡A¥Ñ©ó±z¹ê§@¤F¦h­Ó¤¶­±¡A©Ò¥H­n¾Þ§@ª«¥ó®É¡A¥²­n®É±z¥²¶·§@¡u¤¶­±Âà´«¡v¡A¦p¦¹µ{¦¡¤~¯àª¾¹D¦p¦ó¥¿½Tªº¾Þ§@ª«¥ó¡A¨Ò¦p°²³]someObject¹ê§@¤FISomeInterface1»PISomeInterface2¨â­Ó¤¶­±¡A«h§Ú­Ì¥i¥H¦p¤U¹ïª«¥ó¶i¦æ¤¶­±Âà´«»P¾Þ§@¡G
ISomeInterface1 obj1 = (ISomeInterface1) someObject;
obj1.doSomeMethodOfISomeInterface1();
 
ISomeInterface2 obj2 = (ISomeInterface2) someObject;
obj2.doSomeMethodOfISomeInterface2();
 
·í ©â¶HÃþ§O ¤¤ªº©Ò¦³¤èªk³£¬O©â¶H¤èªk®É¡A¥¦ªº§@¥Î´N»P¤¶­±¦³¨ÇÃþ¦ü¡]¹³¦bC++¤¤¡A¨Ã¨S¦³°Ï¤À©â¶HÃþ§O»P¤¶­±¡^¡A¦ý°O±o¦bJava¤¤¥u¤¹³\³æ¤@Ä~©Ó¡A©Ò¥H±z¤£¯à¦P®É Ä~©Ó¦h­Ó©â¶H¤èªk¡C

¨Æ¹ê¤W¦bJavaùØ¡A©â¶HÃþ§O¤¤¨Ã¤£·|¥þ¬O©â¶H¤èªk¡A³o»ò¨Ï¥Î¨Ã¤£¾A·í¡A¦bJava¤¤°Ï¤À©â¶HÃþ§O»P¤¶­±¡A¨ä¦b»y¸q¤W¬O¦³©Ò¤£¦Pªº¡A¨Ò¦p©â¶HÃþ§O¤¤¤¹³\±z ¥ý¹ê§@¬Y¨Ç¤èªk¡A¦Ó«O¯d¤@¨Ç©â¶H¤èªk¤£¹ê§@¡A¨äÀ³¥Î³õ¦X¤§¤@¬O¹³ Template Method ¼Ò¦¡ ¤¤¤¶²Ðªº¤¶­±©w¸q¤¤ªº¤èªk«h¬O§¹¥þ¤£¹ê§@¡A¥¦¥u©w¸q¤èªk¦WºÙ¡A¤¶­±±`¥Î©ó³W½d²Î¤@ªº¾Þ§@¤¶­±¡A¨äÀ³¥Î³õ¦X¤§¤@¬O¹³ Command ¼Ò¦¡

¤¶­±¤]¥i¥H¶i¦æÄ~©Óªº°Ê§@¡A¦P¼Ë¤]¬O¨Ï¥Î"extends"ÃöÁä¦r¡A¨Ò¦p¡G
¤¤¤¶²Ðªº¡A¤¶­±©w¸q¤@²Õ¨ó©w¡A©Ò¦³¹ê§@¥¦ªºÃþ§O³£¥²¶·¿í¦uªº¨ó©w¡A¤¶­±¥i¥H«OÃÒ¹ê§@¥¦ªºÃþ§O¤@©w·|¹ê§@©Ò©w¸qªº¤èªk¡C
public interface ¦WºÙ extends ¤¶­±1, ¤¶­±2 {
    // ...
}

¤£¦P©óÃþ§Oªº¬O¡A¤¶­±¥i¥H¦P®ÉÄ~©Ó¦h­Ó¤¶­±¡A³o¤]¥i¥H¹F¨ìÃþ¦üC++¤¤¦h­«Ä~©Óªº¥\¯à¡A¦Ó¹ê§@¤l¤¶­±ªºÃþ§O¥²¶·±N©Ò¦³¦b¤÷¤¶­±©M¤l¤¶­±¤¤©Ò©w¸qªº¤èªk¹ê°µ¥X¨Ó¡C



  • ¦h«¬¡]Polymorphism¡^¾Þ§@ªºÀ³¥Î¤Ó¦h¤F¡A±q ³] ­p¼Ò¦¡ ¶}©l¾Ç²ß·|¬O­Ó¤£¿ùªº¿ï¾Ü¡C
  • ¦b«Å§i¤¶­±ªº¦WºÙ®É¡A¤@­Ó±`¨£ªººD¨Ò¬O¦b¦WºÙ«e¥[¤W 'I' ¡A³o©úÅãªí¥Ü³o¬O¤@­Ó¤¶­±¡C
  • §Ú³ßÅw¥Î¤¶­±Âà´«¡A¦Ó¤£¬O¥ÎÂ૬¡]Cast¡^¡A¬°ª«¥óÂà´«¤@­Ó¾Þ§@¤¶­±¡A¦Ó¤£¬O±Nª«¥óÂ૬¡C