Nice TWiki > Doc > CodeExamples > VisitorPatternMultiMethodExample > ExtensibleVisitorPatternExample (r1.5) TWiki webs:
Dev | Doc | Main | TWiki | Sandbox
Doc . { Changes | Index | Search | Go }
/* Please try the NoviceExamples before the MultiMethodExamples
To compile:
   nicec --sourcepath .. -a extensible.jar extensible
To run:
   java -jar extensible.jar
*/


// Extensible Visitor Pattern: Types
//----------------------------------

abstract class Shape {
   <T> T process(IShapeVisitor<T> v);
}

class Square extends Shape { 
   double side; 
   
   process(IShapeVisitor v) = v.forSquare(this);
}

class Circle extends Shape { 
   double radius; 
   
   process(IShapeVisitor v) = v.forCircle(this);
}

class Translated extends Shape { 
   Point d; 
   Shape shape; 
   
   process(IShapeVisitor v) = v.forTranslated(this);
}

class Point { double x; double y; }


// Extensible Visitor Pattern: Operations
//---------------------------------------

interface IShapeVisitor<T> {
   T forSquare(Square s);   
   T forCircle(Circle s);   
   T forTranslated(Translated s);     
}

<T| boolean <: T <: boolean>
class ContainsPointVisitor<T> implements IShapeVisitor<T> {
   Point point; 
   
   ContainsPointVisitor<T> makeVisitor(Point newp) =
      new ContainsPointVisitor(point: newp);

   forSquare(Square s){     
      let d = s.side/2;
      return 
         (point.x >= -d && point.x < d) && 
         (point.y >= -d && point.y < d);
   }


   forCircle(Circle s) =
      // just test the bounding box     
      (point.x >= -s.radius && point.x < s.radius) && 
      (point.y >= -s.radius && point.y < s.radius);
   

   forTranslated(Translated s){ 
      let p' = 
         new Point(
            x: point.x - s.d.x,
            y: point.y - s.d.y );
 
      return s.shape.process(this.makeVisitor(p'));
   }
}  



/*
   =================================================
   Can we add a type and operation without modifying 
   the original code?
   ================================================= 
*/


// Extensible Visitor Pattern: Adding Type Variants
//-------------------------------------------------

class Union extends Shape {
   Shape shape1; 
   Shape shape2; 

   process(IShapeVisitor v) = cast(v).forUnion(this);
}

interface IUnionVisitor<T> extends IShapeVisitor<T> {
   T forUnion(Union s);  
}

<T| boolean <: T <: boolean>
class ContainsPointUnionVisitor<T> 
extends ContainsPointVisitor<T> implements IUnionVisitor<T> {

   ContainsPointUnionVisitor<T> 
   makeVisitor(Point newp) =
      new ContainsPointUnionVisitor(point: newp);

   forUnion(Union s) = 
      s.shape1.process(this) || s.shape2.process(this);
}


// Extensible Visitor Pattern: Adding Operations
//----------------------------------------------

<T| Shape <: T <: Shape>
class ShrinkVisitor<T> implements IUnionVisitor<T> {
   double toPercent;

   forSquare(Square s) = 
      new Square(side: (s.side*toPercent)/100);
      
   forCircle(Circle s) = 
      new Circle(radius: (s.radius*toPercent)/100); 
  
   forTranslated(Translated s) = 
      new Translated(
         d: s.d, 
         shape: s.shape.process(this)
      );  
      
   forUnion(Union s) = 
      new Union(
         shape1: s.shape1.process(this), 
         shape2: s.shape2.process(this)
      );     
}


// Visitor Pattern: Testing
//---------------------------

void main(String[] args){
   let s = new Square(side: 4);
   let c = new Circle(radius: 2);

   let t = 
      new Translated(
         d: new Point(x: 1.5, y: 0),  
         shape: c 
         );

   let p = new Point(x: 3, y: 0);
   let v = new ContainsPointUnionVisitor(point: p);

   println("square contains point " + s.process(v));
   println("circle contains point " + c.process(v));
   println("translated contains point " + t.process(v));

   let vshrink = new ShrinkVisitor(toPercent: 50);
   let t' = t.process(vshrink); 
   println("shrunk translated contains point " + t'.process(v));
                            
   let u = new Union(shape1: s, shape2: t);
   println("union contains point " +  u.process(v));     
}


/* Notes 
See the detailed discussion in
"Synthesizing Object-Oriented and Functional Design to Promote Re-use"
Section 3.4 figures 12
http://citeseer.nj.nec.com/krishnamurthi98synthesizing.html


square contains point false
circle contains point false
translated contains point true
shrunk translated contains point false
union contains point true
*/
-- IsaacGouy - 06 Feb 2004

皮革 床上用品 英语培训 优盘 油画 游戏机 有线电视 幼教 刻录 口吃 口罩 快餐 矿泉水 篮球鞋 浪潮 理财 粮食 猎头 猎头公司 旅游景点 玫瑰 美容院 棉花 民办大学 钱币 桥梁 情报 求职招聘 人才交流 软件公司 扫描 扫描仪 山水 商务网 商行 商业 上海房产 上海租房 上市 少儿英语 设计公司 民歌 玉器 服装辅料 元件 民谣 社保 社会保障 民族音乐 园艺 市场研究 灯箱 远程控制 明信片 社会调查 申请邮箱 牡丹 云南旅游 灯饰 保健食品 生日贺卡 生物工程 在线歌曲 霓虹灯 失眠 农药 造价 花店 农业网 实习 实验 暖通 招生简章 搬家 真空泵厂 世界杯 支原体 直销 试剂 室内装修 喷雾器 职业 盆景 书刊 屏幕 制药厂 卡片 数码照相机 奇石 卡特 痔疮 中草药 开发 棋牌 数字 开发区 考试中心 汽车销售 水环式真空泵 科普 科研 中国律师 展览会 税务师 招聘信息 招商引资 学校管理 思培 塑料包装 学英语 找工作 眼科 泰克 贴纸相 演唱会 植物 制药 药物流产 质量 质量管理 投资公司 智能 中国纺织网 液压 外语学院 一点通 医疗保健 网上商城 玩具出租 网上银行 医疗保险 中国旅行社 保洁 北京翻译 北京翻译公司 中国旅游 网上赚钱 稳压 抑郁症 背景音乐 音像 污水 主页空间 标牌 标志设计 自动化 印刷厂 无线网络 租赁 博士 应聘 无形资产评估 英汉翻译 步进电机 物资 仙人掌 彩信 先锋 纤维 饮食 现代 产品 香格里拉 邮件 成功 邮局 销售 邮票 协会 游记 传真 传真机 信息咨询 运动 姓名学 增高 打折 档案管理 点歌 电工 电力公司 电脑配件 电子信箱 电子邮件 调制解调器 高速公路 工程造价 工业设计 古董 骨科 管理制度 广告策划 规章制度 过滤 汉译英 汉英翻译 汉英互译 合同范本 合作 衡器 交流 交通安全 近视 经营 景点 开关电源 考勤 空压机近视 拉手 辣椒 礼品公司 礼仪 流产 取名 认证 润滑 三菱 设计在线 摄像 深呼吸 生日 石油 事务所 流星雨 互联网 对外贸易 外贸 花语 鼠标 美发 画廊 二胡 环球 美媚 数据 密码 换外汇 会计师事务所 密码破解 水果 水晶 免费MP3下载 绘画 法硕 惠普打印机 法语翻译 台球 机电机电 翻译英文 基金 民办高校 天文 铁道 计量 计数器 奶牛 听力 通信 技术 配件 投资 托福 皮肤 加密 粉碎 外贸公司 平安 家政 富士 家政服务 网吧 网校 维修 无线 无线电 武术 舞蹈 舞曲 系统 下载音乐 相册 项目 效果图 鞋业 心理咨询 信息管理 信箱 诚信 出租 处理 导游 电路 电气 电台 电梯 电子图书 电子邮箱 儿歌 二手 高校招生 工程 工具 公路 公司法 供求 供求信息 古筝 观赏鱼 国画 国际金融 国际旅行社 国家标准 海报 海运 航班 航空 航空公司 合金 合同法 行政管理 户外运动 护理 安防 熊猫 压缩 安全 化工网 案例 翻译社 黄金 婚庆 饭店 办公 阳光 养老保险 防盗 计算机考试 养殖 保温 防辐射 移动通信 房屋 房屋出租 保险公司 手机大全 手机之家 纺织网 交通管理 分析 标志 诺基亚手机 标准 风水 解密 经理人 服装学院 彩屏手机 妇科 九寨沟 餐饮 策划 就业 局域网 俱乐部

Topic ExtensibleVisitorPatternExample . { Edit | Attach | Ref-By | Printable | Diffs | r1.6 | > | r1.5 | > | r1.4 | More }
Revision r1.5 - 29 Jan 2005 - 06:46 GMT - LiYan
Parents: WebHome > CodeExamples > VisitorPatternMultiMethodExample
Copyright © 1999-2003 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback.