接口与抽象类

      设计一个抽象类GeoGraph,定义所有2维图形的共有数据特性:颜色(color,用整型表示)、填充标志(filled,使用boolean),共有行为特性:面积、周长(抽象方法)及其他必要行为特性(实例方法);该类继承Comparable接口和自定义Colorable接口(抽象方法:procColor,用于对图像作色),然后由GeoGraph类派生:CircleSemiCircle(半圆)、Rectangle(矩形)、Triangle三角形)、Oval(椭圆形)、Trapezoid(梯形),重写这些类型的toString方法:类型:面积(Oval456.456),作色方式定义为:图形面积的高2位整数(如果只有1位整数部分,则只取一位或小数点后不为02位数(1 <=color<=99)color赋值,这些类型的其他要求由大家自己定义,但要符合GeoGraph派生类的要求。最后在主类中定义一个GeoGraph数组GeoArray并为该数组创建上面定义类型的图形对象,然后使用Arrays.Sort对数组排序并输出数组,输出方式:对象类型:面积(如:Oval23.54)。排序依据:根据图形面积大小排序。(第9周课堂作业与上机作业共用)

package geograph;

public interface Colorable {
	void precColor();
}
package geograph;

public abstract class GeoGraph implements Colorable, Comparable<GeoGraph> {
	private int color;
	private boolean filled;
	public int getColor() {
		return color;
	}
	public boolean getFilled() {
		return filled;
	}
	public abstract double getArea();
	public abstract double getPerimeter();
	@Override
	public int compareTo(GeoGraph o) {	//按面积从小到大排序
		return this.getArea()>o.getArea()?1:-1;
	}
	@Override
	public void precColor() {//着色
		int a=(int)getArea();
		String b=String.valueOf(a);
		if(b.length()==1) {	//整数部分只有一位,取此位
			color=b.charAt(0)-'0';
		}else {	//整数部分有多位,取前两位
			color=(b.charAt(0)-'0')*10+b.charAt(1)-'0';
		}
	}
}
package geograph;

public class Circle extends GeoGraph{
	private double radius;//半径
	private static final double PI=3.14;
	public Circle(double radius) {
		this.radius=radius;
	}
	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return PI*Math.pow(radius, 2);
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 2*PI*radius;
	}

	@Override
	public String toString() {
		return Circle.class.getSimpleName()+": "+getArea();
	}
}
package geograph;

public class Oval extends GeoGraph {
	private double a;//长半轴长
	private double b;//短半轴长
	private static final double PI=3.14;
	public Oval(double a, double b) {
		super();
		this.a = a;
		this.b = b;
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return PI*a*b;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 2*PI*b+4*(a-b);
	}
	@Override
	public String toString() {
		return Oval.class.getSimpleName()+": "+getArea();
	}
	
}
package geograph;

public class Rectangle extends GeoGraph {
	private double a,b;//长宽
	public Rectangle(double a,double b) {
		this.a=a;
		this.b=b;// TODO Auto-generated constructor stub
	}
	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return a*b;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 2*(a+b);
	}
	@Override
	public String toString() {
		return Rectangle.class.getSimpleName()+": "+getArea();
	}
	
}
package geograph;

public class SemiCircle extends GeoGraph {
	private double radius;//半径
	private static final double PI=3.14;
	public SemiCircle(double radius) {
		this.radius=radius;
	}
	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return PI*radius*radius/2;
	}
	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 2*PI*radius/2+2*radius;
	}
	@Override
	public String toString() {
		return SemiCircle.class.getSimpleName()+": "+getArea();
	}
}
package geograph;

public class Trapezoid extends GeoGraph {
	private double upper;//上底
	private double lower;//下底
	private double high;//高
	private double left;//左边
	private double right;//右边
	
	public Trapezoid(double upper, double lower,  double left, double right, double high) {
		super();
		this.upper = upper;
		this.lower = lower;
		this.high = high;
		this.left = left;
		this.right = right;
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return (upper+lower)*high/2;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return upper+lower+left+right;
	}
	
	@Override
	public String toString() {
		return Trapezoid.class.getSimpleName()+": "+getArea();
	}
}
package geograph;

public class Triangle extends GeoGraph{
	private double side1;
	private double side2;
	private double side3;
	public Triangle(double side1,double side2,double side3) {
		this.side1=side1;
		this.side2=side2;this.side3=side3;// TODO Auto-generated constructor stub
	}
	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		double m=(side1+side2+side3)/2;
		return Math.sqrt(m * (m - side1) * (m - side2) * (m - side3));
	}
	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return side1+side2+side3;
	}
	@Override
	public String toString() {
		return Triangle.class.getSimpleName()+": "+getArea();
	}
}
package geograph;

import java.util.Arrays;
public class TestGeoGraph {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GeoGraph[] geoArray= {new Circle(10),new SemiCircle(10),new Rectangle(10, 10),new Triangle(10, 10, 10),
				new Oval(10, 8),new Trapezoid(5, 10, 5, 5, 5)
		};
		Arrays.sort(geoArray);//排序(面积从小到大)
		for(GeoGraph g:geoArray) {
			System.out.println(g.toString());
		}
	}

}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值