- 通道包含类型E的元素
- 通道还具有端口,该端口允许访问通道中的元素
它应该看起来像这样:
template<
typename E>
class IOutPort{
public:
...
/**
* Takes an element (chosen by the implementation) that is in channel
*
* @return
* The element
*/
virtual E take() = 0;
};
template<
typename E>
class IChannel {
public:
...
/**
* Gives access to the out port of this channel
*
* @return
* A smart pointer to the channel's port
*/
virtual std::shared_ptr<IOutPort<E>> getOutPort() = 0;
};
他们都需要参考自己
此外:
- 通道impl无法在构建时向端口impl提供其自身的shared_ptr(因为它还没有完成(
- 如果两者都使用强引用,它们将永远不会被释放
- 某些用户代码可能希望存储端口的指针以便以后使用。。。所以那个时候通道一定还存在
用weak_ptr破圈可能会导致通道过早破坏!
在不合并两个接口的情况下,遵循哪种模式是最好的??
编辑:@Edwin是的,我已经查看了现有的讨论。。。我要寻找的答案更符合道德而非技术。。。
实质上,在像C++这样的语言中,当被编写的对象需要访问composer时,在构建时缺乏内存管理和"this"可用性的编写有哪些优势?
我认为唯一的解决方案是在同一个类中实现composer和(私下(所有组件接口(以解决组件到composer的通信问题(。也许可以提供这个独特的同类的特定视图,使其看起来像是"has-a"关系中的"is-a"关系。。。但在这种情况下,所有的构图优势都失去了!
这个问题过于抽象,与应用程序分离。当通道中的内容发生变化时会发生什么,谁负责通过端口进行传播?应用程序由流协议而不是面向对象的API提供更好的服务吗?将有多少个通道和多少个端口侦听器?