Java中的多态性和接口(可以使用多态来实现接口......为什么?)

时间:2011-03-24 17:31:41

标签: java interface polymorphism

在现实世界中,人们使用它来解决什么类型的问题?我可以看到这些协同工作的示例代码吗?我所能找到的只是关于猫狗说话或者喝牛奶或咖啡的人的代码......

人们真的用接口实现多态吗?为什么?

8 个答案:

答案 0 :(得分:12)

当然,

下面是“Observer”模式的具体示例,使用类和接口在记录器系统中实现多态行为:

interface ILogger{

   public void handleEvent (String event);
}

class FileLogger implements ILogger{

   public void handleEvent (String event){
       //write to file
   }
}

class ConsoleLogger implements ILogger{

   public void handleEvent (String event){
       System.out.println( event );
   }
}

class Log {

   public void registerLogger (ILogger logger){

       listeners.add(logger);
   }

   public void log (String event){

       foreach (ILogger logger in listeners){

            logger.handleEvent(event); //pass the log string to both ConsoleLogger and FileLogger!
       }
   }

   private ArrayList<ILogger> listeners;
}

然后,您可以按如下方式使用它:

public static void main(String [] args){

     Log myLog();
     FileLogger myFile();
     ConsoleLogger myConsole();

     myLog.registerLogger( myFile );    
     myLog.registerLogger( myConsole );

    myLog.log("Hello World!!");
    myLog.log("Second log event!");
}

希望这有助于您理解接口和多态性。

答案 1 :(得分:7)

Map<String,Person> peopleByName = new HashMap<String,Person>();

如果在接下来的路上,我决定HashMap的内存开销过多,我可以将其作为TreeMap重新执行,并且使用稍微昂贵的查找时间

Map<String,Person> peopleByName = new TreeMap<String,Person>();

因为peopleByName是Map,而不是TreeMap或HashMap,所以无论实现如何,我的所有调用都可以在任一地图上工作。

以下示例

最能说明这一点
public class CatsAndDogsDrinkingMilkAndCoffee {

   // what, no? :-(

}

答案 2 :(得分:4)

interface Request {
  Response execute();
}
interface Response {
  String serialize();
}
class RequestProcessor {
  void processRequest(Request r) {
    logger.log("Request: " + r);
    Response s = r.execute();
    logger.log("Response: " + s);
    connectionManager.write(r.serialize());
  }
}

在这个例子中说,RequestProcesor不需要知道请求和响应的实现

答案 3 :(得分:1)

以Map / AbstractMap / HashMap的代码为例。您将在JDK源代码中找到数千个其他示例,这些示例随JDK一起提供(在src.zip中)

答案 4 :(得分:1)

想象“某人”设计了一个庞大的程序,有很多代码。假设“某人”在某些控制器逻辑的设计中使用了接口。现在你被聘用了这个你从未见过的代码。你被要求设计一个新的控制器类。您现在需要做的就是实现接口并使其所有方法都能正常工作。

如果有人没有使用接口,那么你不仅需要重新设计控制器,而且你可能需要重新设计整个项目,因为控制器类和其他类之间存在非常强的耦合。这只需要几个月的时间来理解代码,更不用说你可能会介绍的新错误了。

答案 5 :(得分:1)

几乎所有使用GUI的Java应用程序都使用它(但当然不仅仅是GUI ......)。例如,查看android VideoView的来源(这是我想到的第一个......)

答案 6 :(得分:1)

我对“现实世界”的另一个建议是使用弹簧批。如果您有一个常用的报告格式,其格式如“拉数据,创建报告,发送给收件人”,则可以为报告创建一个强制执行此标准的界面。从这个意义上讲,它就像一个“模板”,所有批处理报告都会跟随它。

一个无聊的例子,但这是我第一年面临的事情......

答案 7 :(得分:0)

您是否想知道.net中的LINQ如何工作?这都是关于接口和多态的。

你需要处理项目,然后你会了解这一切。