6.34 使用接口模仿枚举类继承

枚举类不能继承其它类,但是枚举类可以继承接口,如下接口:

public interface Operation {
	double apply(double x,double y);
}

 

BaseOperation、ExtendedOperation实现了此接口:

public enum BaseOperation implements Operation {
	PLUS("+") {
		public double apply(double x, double y) {
			return x + y;
		}
	},
	MINUS("-") {
		public double apply(double x, double y) {
			return x - y;
		}
	},
	TIMES("*") {
		public double apply(double x, double y) {
			return x * y;
		}
	},
	DIVIDE("/") {
		public double apply(double x, double y) {
			return x / y;
		}
	};
	
	private String symbol;
	
	private BaseOperation(String symbol){
		this.symbol=symbol;
	}

}

 

public enum ExtendedOperation implements Operation {
	EXP("^") {
		public double apply(double x, double y) {
			return Math.pow(x, y);
		}
	},
	REMAINDER("%") {
		public double apply(double x, double y) {
			return x % y;
		}
	};
	private final String symbol;

	ExtendedOperation(String symbol) {
		this.symbol = symbol;
	}

	@Override
	public String toString() {
		return symbol;
	}
}

 

BaseOperation、ExtendedOperation可实现继承了Operation接口的子类,但是两者之间没有继承关系。在使用上可以使用泛型限制数据类型,如下:

	private static <T extends Enum<T> & Operation> void test(Class<T> opSet,
			double x, double y) {
		for (Operation op : opSet.getEnumConstants())
			System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
	}

	private static void test(Collection<? extends Operation> opSet, double x,
			double y) {
		for (Operation op : opSet)
			System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
	}

 

 

 

 

你可能感兴趣的:(接口)