1.C++ & 混型

C++能够记住其模板参数的类型,对于混型来说,使用参数化类型更加优雅。

  1. #include <string>
  2. #include <ctime>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. template<class T> class TimeStamped : public T {
  7. long timeStamp;
  8. public:
  9. TimeStamped() { timeStamp = time(); }
  10. long getStamp() { return timeStamp; }
  11. };
  12.  
  13. template<class T> class SerialNumbered : public T {
  14. long serialNumber;
  15. static long counter;
  16. public:
  17. SerialNumbered() { serialNumber = counter++; }
  18. long getSerialNumber() { return serialNumber; }
  19. };
  20.  
  21. // Define and initialize the static storage:
  22. template<class T> long SerialNumbered<T>::counter = ;
  23.  
  24. class Basic {
  25. string value;
  26. public:
  27. void set(string val) { value = val; }
  28. string get() { return value; }
  29. };
  30.  
  31. int main() {
  32. TimeStamped<SerialNumbered<Basic> > mixin1, mixin2; //这就是我想要的
  33. mixin1.set("string1");
  34. mixin2.set("string2");
  35. cout << mixin1.get() << " " << mixin1.getStamp() << " " << mixin1.getSerialNumber() << endl;
  36. cout << mixin2.get() << " " << mixin2.getStamp() << " " << mixin2.getSerialNumber() << endl;
  37. }

输出:

  1. string1
  2. string2

二。Java & 混型

Java由于擦除会忘记基类类型。因此泛型类不能直接继承一个泛型参数。

1.使用接口产生混型

  1. interface TimeStamped {
  2. long getStamp();
  3. }
  4.  
  5. interface SerialNumbered {
  6. long getSerialNumber();
  7. }
  8.  
  9. interface Basic {
  10. public void set(String val);
  11. public String get();
  12. }

实现接口

  1. class TimeStampedImp implements TimeStamped {
  2. private final long timeStamp;
  3. public TimeStampedImp() {
  4. timeStamp = new Date().getTime();
  5. }
  6. public long getStamp() { return timeStamp; }
  7. }
  8.  
  9. class SerialNumberedImp implements SerialNumbered {
  10. private static long counter = 1;
  11. private final long serialNumber = counter++;
  12. public long getSerialNumber() { return serialNumber; }
  13. }
  14.  
  15. class BasicImp implements Basic {
  16. private String value;
  17. public void set(String val) { value = val; }
  18. public String get() { return value; }
  19. }

使用

  1. class Mixin extends BasicImp implements TimeStamped, SerialNumbered {
  2. private TimeStamped timeStamp = new TimeStampedImp();
  3. private SerialNumbered serialNumber = new SerialNumberedImp();
  4.  
  5. public long getStamp() { return timeStamp.getStamp(); } //代理
  6. public long getSerialNumber() { //代理
  7. return serialNumber.getSerialNumber();
  8. }
  9. }
  10.  
  11. public class Mixins {
  12. public static void main(String[] args) {
  13. Mixin mixin1 = new Mixin();
  14. Mixin mixin2 = new Mixin();
  15. mixin1.set("string1");
  16. mixin2.set("string2");
  17. System.out.println(mixin1.get() + " " + mixin1.getStamp() + " " + mixin1.getSerialNumber());
  18. System.out.println(mixin2.get() + " " + mixin2.getStamp() + " " + mixin2.getSerialNumber());
  19. }
  20. }

2.使用装饰器模式

  1. class Basic {
  2. private String value;
  3. public void set(String val) { value = val; }
  4. public String get() { return value; }
  5. }
  6.  
  7. class Decorator extends Basic {
  8. protected Basic basic;
  9. public Decorator(Basic basic) { this.basic = basic; }
  10. public void set(String val) { basic.set(val); }
  11. public String get() { return basic.get(); }
  12. }
  13.  
  14. class TimeStamped extends Decorator {
  15. private final long timeStamp;
  16. public TimeStamped(Basic basic) {
  17. super(basic);
  18. timeStamp = new Date().getTime();
  19. }
  20. public long getStamp() { return timeStamp; }
  21. }
  22.  
  23. class SerialNumbered extends Decorator {
  24. private static long counter = 1;
  25. private final long serialNumber = counter++;
  26. public SerialNumbered(Basic basic) { super(basic); }
  27. public long getSerialNumber() { return serialNumber; }
  28. }
  29.  
  30. public class Decoration {
  31. public static void main(String[] args) {
  32. TimeStamped t = new TimeStamped( new Basic() );
  33. TimeStamped t2 = new TimeStamped( new SerialNumbered( new Basic() ));
  34. //! t2.getSerialNumber(); // Not available
  35. SerialNumbered s = new SerialNumbered(new Basic());
  36. SerialNumbered s2 = new SerialNumbered( new TimeStamped( new Basic() ));
  37. //! s2.getStamp(); // Not available
  38. }
  39. }

局限性:

可以添加多个修饰层,但最后一层才是有效的。

3.动态代理

Java & 混型的更多相关文章

  1. JAVA混型和潜在类型机制

    一.混型 ①.定义 二.利用JAVA如何实现混型 ①.代理   ②.装饰器模式  ③.动态代理模式   ④.装饰器模式与代理模式的区别 三.潜在类型机制 ①.定义 四.JAVA的潜在类型机制的补偿 ① ...

  2. Processing与Java混编初探

    Processing其实是由Java开发出的轻量级JAVA开发语言,主要用于做原型,有setup.draw两个主接口和几个消息相应接口 Processing和Java混编很简单...在Java中引入外 ...

  3. Java范型随笔

    最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...

  4. 6. 站在巨人的肩膀学习Java Filter型内存马

    本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...

  5. Java整型与字符串相互转换(转)

    1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...

  6. Java之戳中痛点 - (7)善用Java整型缓存池

    先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...

  7. Java范型

    泛型不用考虑对象的具体类型.优点在于,因为不用考虑对象的具体类型所以可以对一类对象执行一定的相同操作:缺点在于,因为没有考虑对象的具体类型所以就不能使用对象自带的接口函数.泛型的最佳用同是实现容器类. ...

  8. 从字节码层面,解析 Java 布尔型的实现原理

    最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型? 要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件 ...

  9. Java范型学习笔记

    对于范型的使用或者说印象只有集合,其他地方即使使用过也不知道,反正就是只停留在List<E> Map<K, V>,最近刚好闲来无事,就找找资料学习一下:下列为个人学习总结,欢迎 ...

随机推荐

  1. [Functional Programming] Compose Simple State ADT Transitions into One Complex Transaction

    State is a lazy datatype and as such we can combine many simple transitions into one very complex on ...

  2. 使用HttpClient测试SpringMVC的接口

    转载:http://blog.csdn.net/tmaskboy/article/details/52355591 最近在写SSM创建的Web项目,写到一个对外接口时需要做测试,接受json格式的数据 ...

  3. URAL 1984. Dummy Guy(数学啊)

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1984 1984. Dummy Guy Time limit: 0.5 second Me ...

  4. eclipse debug调试java程序的九个技巧

    九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions display 远程debug 最早开始用eclipse的debug的时候,只会F5 F6 F ...

  5. Linux下Nagios的安装与配置(转载)

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  6. matlab 常用函数汇总

    1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 Na ...

  7. 解决PHP显示Warning和Notice等问题

    PHP在安装后,会在php.ini 文件中设置报错.提醒.警告等方式的出现,这样的方式可以使我们在调试PHP程序的时候能及时了解程序所存在的问题.然后,有时候我们并不需要提醒.警告 等内容,比如当我们 ...

  8. PHP接收和发送XML数据(json也通用)

    一.接收xml数据, 使用php://input,代码如下: <?php $xmldata=file_get_contents("php://input"); $data=s ...

  9. win 下g++ 安装、环境配置等

    工具:eclipse for c++: 由于eclipse没有集成c++的编译器及执行环境,所以须要自己额外安装g++等. 方法: 使用MinGW来下载和安装须要的工具: 下载地址:http://ww ...

  10. fedora20配置静态ip

    在linux的世界里.给主机设置固定ip是这么做的(使用root用户): 1.查看要配的网络接口 用ifconfig查看查看在用的网卡接口,一般都用第一个如:eth0,en1,em1等 2.停用网络自 ...