面向对象的疑惑,java设计正方形,长方形

来源:互联网 发布:老式电视网络机顶盒 编辑:程序博客网 时间:2024/05/16 00:27

    这是京东网银在线面试的时候问到的,之前一点没准备过关于设计的东西,所以当场让设计简单的正方形长方形就有点虚,说的几个方案貌似面试官都不是很满意,回来查了一下博客,发现这个问题的讨论还蛮多的,尤其是关于能不能用继承来设计,貌似还专门有人有了篇论文。

    先说一下大部分人比较认可的一个方案吧,设计一个接口,求面积和周长两个方法,然后长方形和正方形各自实现这个接口。代码如下:

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;}@Overridepublic double area() {return this.width*this.height;}@Overridepublic double perimeter() {return 2*(this.width+this.height);}}
public class Square implements Shape {private double side;public Square(double side){this.side=side;}@Overridepublic double area() {return side*side;}@Overridepublic 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的一个框架感觉很自然,或者读者在看上面代码的时候感觉没啥难的,平时也一口一个面向对象,不过平心而论,在什么都没有的情况下让自己设计几个类还是有点难度的,可能因为平时在学校写代码也不会涉及到多少设计方面的东西,所以以后有机会还需要在实际项目里多锻炼自己的思维吧。

0 0
原创粉丝点击