面试题答案
一键面试常见应用场景及遵循原因
- 图形绘制
- 场景举例:假设有一个
Shape
类作为父类,有Rectangle
(矩形)、Circle
(圆形)等子类继承自Shape
。在图形绘制系统中,可能有一个方法drawShapes(List<Shape> shapes)
,该方法接收一个Shape
类型的列表,然后遍历列表绘制每个图形。当向这个列表中添加Rectangle
或Circle
对象时,都能正确绘制。 - 遵循原因:如果不遵循里氏替换原则,比如
Rectangle
类中重写draw
方法的逻辑与Shape
类的预期行为不符(例如改变了绘制的基本规则),那么在drawShapes
方法调用Rectangle
对象的draw
方法时,就可能出现绘制异常,破坏整个图形绘制系统的功能。遵循里氏替换原则能确保在使用父类的地方可以无缝替换为子类,保持系统行为的一致性。
- 场景举例:假设有一个
- 数据库操作
- 场景举例:有一个
Database
父类提供基本的数据库连接、查询等方法。MySQLDatabase
和OracleDatabase
等子类继承自Database
。在一个数据访问层(DAO)中,可能有一个通用的方法getData(String query, Database db)
,通过传入不同的数据库子类对象(MySQLDatabase
或OracleDatabase
)来执行查询操作。 - 遵循原因:如果子类不遵循里氏替换原则,例如
MySQLDatabase
重写的query
方法改变了查询返回数据的格式与父类Database
预期的不一致,那么getData
方法在使用MySQLDatabase
对象进行查询时,后续处理数据的代码可能因为数据格式问题而报错。遵循里氏替换原则可以保证在数据访问层代码不依赖于具体数据库类型的细节,只要是Database
子类都能正确执行数据库操作。
- 场景举例:有一个
- 文件处理
- 场景举例:定义一个
FileHandler
父类,有TextFileHandler
(处理文本文件)和BinaryFileHandler
(处理二进制文件)子类继承自它。在一个文件处理系统中,可能有一个方法processFiles(List<FileHandler> handlers)
,用于遍历处理不同类型的文件。 - 遵循原因:若子类不遵循里氏替换原则,比如
TextFileHandler
重写的process
方法在处理文件时,对文件编码的处理与父类FileHandler
的预期不符,那么在processFiles
方法调用TextFileHandler
对象的process
方法时,可能导致文本文件处理出错。遵循里氏替换原则可以确保在处理文件的通用代码中,能正确处理不同类型的文件,保证文件处理系统的稳定运行。
- 场景举例:定义一个