概述
这个名词不太理解,直接引用书上的解释例子
如果一个系统要分析和执行数学表达式,我们可能会声明Number.plus(Number)和Number.multiple(Number)等等。其中Number是各种数字对象的超类。当使用a.plus(b)的时候,并不知道a或b的确切类型,如何能保证正确的交互呢?
java只支持单路分发,如果要执行上面的操作包含了不止一个类型未知的对象时,那么java的动态绑定机制只能处理其中一个类型。所以必须自己来判定其他的类型。
书上用enum实现多路分发的例子
import static enumerated.Outcome.*;
public enum RoShamBo implements Competitor<RoShamBo>{
PAPER(DRAW, LOSE, WIN),//如果自己是出布,对方出(布、剪刀和石头)输赢分别是(平局,输,赢)
SCISSORS(WIN, DRAW, LOSE),
ROCK(LOSE, WIN, DRAW);
private Outcome vPaper, vScissors, vRock;
//构造函数接受三个参数 依次是 布、剪刀和石头
RoShamBo(Outcome paper, Outcome scissors, Outcome rock) {
this.vPaper = paper;
this.vScissors = scissors;
this.vRock = rock;
}
@Override
public Outcome complete(RoShamBo comptitor) {
switch (comptitor) {
case PAPER:
return vPaper;
case SCISSORS:
return vScissors;
case ROCK:
return vRock;
default:
return null;
}
}
public static void main(String[] argv) {
play(RoShamBo.class, 20);
}
//以下部分可以单独写为工具方法
/**
* <T extends Competitor<T>>规定传入的参数必须是Competitor<T>类型
* 这个不是返回值 这个方法是void的,没有返回
*/
public static <T extends Competitor<T>> void match(T a, T b) {
System.out.println(a + " vs " + b + ": " + a.complete(b));
}
/**
* 随机产生指定数量个场景(对象)进行游戏
* 调用了Enums工具方法Enums.random
* <T extends Enum<T> & Competitor<T>> 规定传入的参数必须同时是Enum<T>和Competitor<T>类型
* @param rsbClass 用来比赛的对象
* @param size 数量
*/
public static <T extends Enum<T> & Competitor<T>>
void play(Class<T> rsbClass, int size) {
for(int i = 0; i < size; i++) {
match(Enums.random(rsbClass), Enums.random(rsbClass));
}
}
}
输出结果
ROCK vs ROCK: DRAW
SCISSORS vs ROCK: LOSE
SCISSORS vs ROCK: LOSE
SCISSORS vs ROCK: LOSE
PAPER vs SCISSORS: LOSE
PAPER vs PAPER: DRAW
PAPER vs SCISSORS: LOSE
ROCK vs SCISSORS: WIN
...
代码倒是可以理解,很有意思的一段代码。但是对多路分发这个,还不是太理解。。
最后
以上就是老实钢笔为你收集整理的多路分发-枚举类型的全部内容,希望文章能够帮你解决多路分发-枚举类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复