狂想:关于类的插接技术(0分)

  • 主题发起人 主题发起人 ddev
  • 开始时间 开始时间
D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
狂想:关于类的插接技术
## 定义
假设有这么一种类的处理:

//主体/母体
class cmaincont {
public:
cmount* mounts;
...
}

//插入件
class ccontobj {
...
}

其中 cmount 大致是这么一个东西:
//接口规范
class cmount {
public:
MOUNT mount;
INT* interrupt;
int flag;
...
}

## 描述:
取一个直观的实例:主板、PCI卡、AGP卡等,为叙述方便,
统一叫做插件。主板提供各种插件的接口位置,并且每个插
件位置都有一个固定的电气接口标准,比如AGP卡不能插到
PCI卡口。相当于类 cmaincont 定义的 mounts 数组,每一
个 mount,如:mount1, mount2, mount3 都有各自的接口规
范定义,与主板相似,每个接口都只提供一个大的规范,但
并不要求每个 mount 都必须不同,甚至可以说每个 mount
允许完全一样。其中 mount 的接口规范便定义在 mount.interrupt
中,它指示该接口必须具备的功能中断。

然后,需要将一个插件接到主板,现在是:ccontobj->cmaincont。
1、可插。
ccontobj 必须遍历 cmaincont 的每个 mounts,要求该 mount
不能被占用;符合 interrupt 规范(假设这两个条件叫可插入条件)。
这相当于把一个 AGP卡插到主板的过程。如果是老的PC,可能没有
AGP卡口,则称为不可插入。如果 ccontobj 发现可插,则继续下面
的注册过程。

2、注册/装配
注册过程是指:由于 ccontobj 提供的功能要远大于 mount
指定的 interrupt 必备功能。因此 ccontobj 在插入过程中进行自我
功能注册:重置 interrupt 功能表。然后置位 mount.flag,说明该
接口位已经被占用。

3、访问
有一个 caccess 类,它只知道 cmaincont 可访问,也没有
必要知道有没有 ccontobj 的存在。比如:这是一个网卡。
caccess 向 cmaincont 发出请求:我想看看网络邻居。cmaincont
接到这个请求,于是遍历 mounts ,想知道哪一个可用的 mount 是符合
这种请求的。如果发现没有,则可以返回信息:你还没买网卡呢!如果
成功,比如 mount1 符合,则可以向 mount1 发出中断:INT_ENUM_NEIGHBOURHOOD。
mount1 接收到中断,于是扫描网络,得到结果后,向母体响应中断:
INT_ENUM_NEIGHBOURHOOD + INT_SUCCESS_FAIL。这样 cmaincont 就可以
回答 caccess 了。如果没有找到合适的插件,则直接向 caccess 返回:
INT_REQ_FAIL,说明访问失败。

4、拆卸
如果 ccontobj 认为已经完成或没有必要再驻留,则可以退出:
恢复 mount 的初始中断表;清位 flag。然后 destroy。

5、关键
对于 cmaincont 向 ccontobj 发出中断,是很简单的,只要遍历
中断表,就可以判断出是否有合适的中断可用。而由 ccontobj 响应 INT
则可能不是太直接了,cmaincont 如何知道 ccontobj 已经有响应了呢?
模拟 WINDOWS 的消息过程进行轮询?最简单的,可以这样处理:cmaincont
可以建立一个中断缓冲池,用于缓冲 ccontobj 的回应,然后指定 caccess
必须再次向 cmaincont 发结果询问中断:INT_QUERY_RESULT,于是 cmaincont
只要检索缓冲池,就可以得到结果了。

## 浮想
如果这种技术能够实现,那么类的灵动性可以大大提高。一个主类没有必要
“总是”去聚合所有可能用到的其它类了 ---- 它只是简单地提供插件接口,
然后,程序过程中可以“即插即用”,需要什么就挂什么。就象DIY一台PC。

 
没看到什么好处
只是不好的controller模式而已
>>程序过程中可以“即插即用”,
你想处理jpeg,只要引用jpeg单元就可以了,看看源代码,算不算“即插即用”?
这样的用法多了去了
 
接受答案了.
 
后退
顶部