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

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

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

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的一个框架感觉很自然,或者读者在看上面代码的时候感觉没啥难的,平时也一口一个面向对象,不过平心而论,在什么都没有的情况下让自己设计几个类还是有点难度的,可能因为平时在学校写代码也不会涉及到多少设计方面的东西,所以以后有机会还需要在实际项目里多锻炼自己的思维吧。

你可能感兴趣的:(Java学习总结)