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

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

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

当然,

下面是“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 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!"); } 

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

 Map peopleByName = new HashMap(); 

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

 Map peopleByName = new TreeMap(); 

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

以下示例最好地说明了这一点

 public class CatsAndDogsDrinkingMilkAndCoffee { // what, no? :-( } 
 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不需要知道Request和Response的实现

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

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

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

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

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

一个无聊的例子,但这是我在第一年遇到的事情……

你有没有想过.net中的LINQ如何工作? 这都是关于接口和多态的。

您需要处理项目,然后您将了解所有这些。