- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个如下所示的界面:
class IThing {
...
virtual IHandle* getHandle(void) = 0;
virtual void useHandle(IHandle *handle) = 0;
};
class IHandle { ... }
我希望用户能够实现 IThing 和 IHandle。例如,如果用户创建了 MyThing
和 MyHandle
,getHandle
应该返回一个指向 MyHandle
的指针,用户稍后可以在 useHandle
中使用。
这会起作用,但我不喜欢这种设计,因为 IHandle
的多个实现可能会在 IThing
的实现之间混淆。同样在 useHandle
中,用户需要显式向下转换为他们的 IHandle
实现。是否有更类型安全的方法来执行此操作?
最佳答案
我不太确定你想设计什么。但这里有一些想法,希望对您有所帮助。
基本原则是从IThing
公开派生的类确实是IThing
。因此,您可以用 IThing
做的所有事情,您都可以用 MyThing
做,包括获取 IHandle
。
没有设计问题,只要您的 IHandle
派生都遵循相同的原则。这意味着您的东西不应该对特定句柄做出任何假设,反之亦然。
但是,如果您在 MyHandle
的实现中使用假设它与 MyThing
链接(反之亦然),您将遇到您描述的问题。事实上,您使用的依赖项未在您的类定义中表达。所以是的,你必须使用沮丧。这很不舒服,因为它揭示了设计问题。
由于您的类是多态的,您可以通过使用 dynamic_cast
检查 nullptr 来限制向下转型的风险。但这是一种解决方法,而不是设计改进。
或者,您可以考虑使用模板。它们可以帮助您在编译时链接相关类型。您将获得类型安全性,但您将失去运行时多态性的一些灵 active 。一种示例方法:
template <class IH>
class IThing {
public:
virtual IH* getHandle(void) =0;
virtual void useHandle(IH *handle) =0;
};
class MyHandle { }; // to keep it simple,
class MyThing: public IThing<MyHandle> {}; // instantiation with specific handle
int main() {
MyThing i;
MyHandle *h;
h = i.getHandle();
...
}
此示例中的约束是您不能使用不同的句柄混合使用不同的 IThings
。
关于C++ 设计 : inheritance and returning opaque handles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917331/
嗨,你能帮忙吗 xcode 在第 4 行说:(函数不透明返回类型被推断为“按钮”,它根据自身定义了不透明类型) 感谢您的帮助 <3 Button(action: { self.showingProfi
有人对什么是“不透明类型”有很好的解释吗?我在 CFBundleRef 的上下文中看到了这个术语,他们说:“CFBundleRef 不透明类型”。那是只读类型吗? 最佳答案 “不透明类型”是您没有st
我正在尝试正确解释来自对 URL 的 fetch 调用的响应,我认为这是一个 json 字符串。我已经根据此处的类似帖子尝试了许多变体,但没有什么可以让我使用有用的数据。这是一种尝试: fetch('
我正在编写一个哈希表,并且我正在使用一个不透明的指针来管理这个 ADT。这是我的代码的样子: 哈希表.h typedef struct hash_table *Hash_table; Hash_tab
我知道键是什么,我知道其他上下文中的不透明键是什么 - 但数据库上下文中的不透明键是什么? 最佳答案 这意味着它除了用于查找记录之外没有任何实际意义 - 它应该被视为任意数据,除了键入之外没有其他目的
在 PyQtGraph、GLScatterPlotItem 中,当点重叠时,我希望这些点不会将颜色混合在一起。我想看到最近的点,而不是后面的点。 我已经要求颜色不透明(alpha = 1.0),但是当
在 Cocoa 中,特别是 iPhone SDK,opaque 属性描述为: If opaque, the drawing operation assumes that the view fills
This question already has answers here: Youtube iframe wmode issue (9个答案) 7年前关闭。 上面的注释:这不是重复的问题! The
问候, 我想在表面 View 上放置一个图像。但是我希望图像是透明的,这样您就可以看到图像以及潜在的表面 View 。谁能建议我该怎么做? 最佳答案 这就是我在绘制形状之前的做法。 Bitmap bu
如何动态添加 wmode="opaque" 到已经显示的 embed 元素?在不重新加载元素的情况下,嵌入的内容不应丢失其状态。 仅使用 javascript 设置 wmode 属性是行不通的。 删除
我刚在那个网站上找到了一些东西:iphoneexamples.com .查看“显示图像”时,我发现了一些新东西。 myImage.opaque = YES;//为了性能显式不透明 有人可以给我解释一下
我希望我的表格单元格能够快速加载,因此我将单元格内的所有 UILabel 设置为不透明=YES;这很好,因为我也将背景设置为白色,看起来很正常。 当您单击单元格时,问题就出现了,因为这些标签的背景是白
在大多数有关在 Kubernetes 中使用 secret 的示例中,您都可以找到类似的示例: apiVersion: v1 kind: Secret metadata: name: mysecr
我有一个覆盖 drawRect 的 UIView 子类:以实现各种效果(渐变背景、具有不同半径的圆角等)。当我分析应用程序并在模拟器/仪器中启用颜色混合层时,此类的实例永远不会是绿色的,即使它只是绘制
Typescript 没有内置的 Opaque类型 like Flow does .所以我做了自己的定制Opaque类型: type Opaque = Type & {readonly __TYPE_
我使用以下脚本添加 wmode="opaque"来嵌入元素: jQuery("iframe[src], embed[src]").each(function () { jQuery(this)
在ffmpeg中有一个结构AVFrame描述解码的视频或音频数据。 它有一个空指针不透明。该文档声称它是“用于用户的一些私有(private)数据”。 这是什么意思?它可以用于传输任何附加数据作为每帧
假设我有一个抽象对象,可以由多个独立的插件作者实现。 (例如,错误数据库连接)我不希望我的位的消费者必须处理每个特定的插件类型。 我还想将解析配置文件的过程与实际初始化数据库插件和其他类似事情的过程分
我有两个如下所示的界面: class IThing { ... virtual IHandle* getHandle(void) = 0; virtual void useHa
我在 the documentation for a windows OS "DRIVER_OBJECT" 中看到驱动程序对象是部分不透明的。但是“部分不透明”是什么意思? 我猜这意味着只有 DRIV
我是一名优秀的程序员,十分优秀!