在现实世界中,人们使用它来解决什么类型的问题?我可以看到这些协同工作的示例代码吗?我所能找到的只是关于猫狗说话或者喝牛奶或咖啡的人的代码......
人们真的用接口实现多态吗?为什么?
答案 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如何工作?这都是关于接口和多态的。
你需要处理项目,然后你会了解这一切。