繁体   English   中英

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

[英]Polymorphism and Interfaces in Java (can polymorphism be used to implement interfaces…why?)

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

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

当然,

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

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

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? :-(

}
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如何工作? 这都是关于接口和多态的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM