这是京东网银在线面试的时候问到的,之前一点没准备过关于设计的东西,所以当场让设计简单的正方形长方形就有点虚,说的几个方案貌似面试官都不是很满意,回来查了一下博客,发现这个问题的讨论还蛮多的,尤其是关于能不能用继承来设计,貌似还专门有人有了篇论文。
先说一下大部分人比较认可的一个方案吧,设计一个接口,求面积和周长两个方法,然后长方形和正方形各自实现这个接口。代码如下:
- public interface Shape {
- public double area();
- public double perimeter();
-
- }
- public class Rectangle implements Shape {
- private double width;
- private double height;
- public Rectangle(double width,double height){
- this.width=width;
- this.height=height;
- }
- @Override
- public double area() {
- return this.width*this.height;
- }
- @Override
- public double perimeter() {
- return 2*(this.width+this.height);
- }
- }
- public class Square implements Shape {
- private double side;
- public Square(double side){
- this.side=side;
- }
- @Override
- public double area() {
- return side*side;
- }
-
- @Override
- public double perimeter() {
- return 4*side;
- }
- }
这个比较容易懂吧,也没啥问题,不过这种方案把长方形正方形的类划分在相平行的等级里了,总觉得有点不太合适。
当时面试的时候设计长方形就是上面代码这样,但是一根筋地想让正方形去继承长方形(因为正方形是长方形的特例嘛),不过正方形这个类怎么设计一直没设计出来(因为边长不知道怎么搞定)。回来又看了一下head first和 thinking,两本书里都明确说了,大部分继承关系都可以用is-a来表示,正方形 is a 长方形,所以应该可以用继承来设计正方形。后来想到可以在构造函数中使用super函数,这样一来正方形的类中就不用再写任何方法了。代码如下(接口和长方形的类如上所示,不做任何改变):
- public class Square extends Rectangle{
- private double side;
- public Square(double side){
- super(side,side);
- this.side=side;
- }
- public static void main(String[] args) {
- Square s=new Square(2.5);
- System.out.println(s.perimeter());
- System.out.println(s.area());
- }
- }
表示突然面试的时候让设计OO的类还是很难想到构造函数用super的吧,因为自己平时就没这么设计过。
还想在这边说一下的是,虽然平时看别人的OO的一个框架感觉很自然,或者读者在看上面代码的时候感觉没啥难的,平时也一口一个面向对象,不过平心而论,在什么都没有的情况下让自己设计几个类还是有点难度的,可能因为平时在学校写代码也不会涉及到多少设计方面的东西,所以以后有机会还需要在实际项目里多锻炼自己的思维吧。
|