- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当你有一个类型取决于某些约束的成员时,你如何设计多态性。
假设我有这个:
template<typename T>
class Base
{
public:
Base() = default;
virtual ~Base() = default;
T member;
};
class DerivedA : public Base<int>
{
public:
DerivedA() {member = 5;}
};
class DerivedB : public Base<float>
{
public:
DerivedB() = default;
};
我希望能够根据不同的参数创建一个新的派生对象,即:
Base *b;
if (something)
b = new DerivedA();
else
b = new DerivedB();
显然我不能这样做,因为我需要为 b
的声明提供模板参数.
这是糟糕的设计吗?你如何处理这个问题?
我可以写一个小包装器:
class Wrapper() {};
template<typename T>
class Base : public Wrapper
{
// ...
};
Wrapper a, b;
a = new DerivedA;
b = new DerivedB;
但那样我就无法直接访问 member
或 Base
中声明的其他方法或 Derived
.我需要投:reinterpret_cast<DerivedA*>(a)->member
,使多态性无用。
谢谢
最佳答案
包装设计应该正是您正在寻找的。问题是 c++ 是静态类型的,所以你不能在不指定其类型的情况下声明成员。避免这种情况的常见方法是设计一个支持您想要的所有功能的基类,并在派生类中实现特定行为,就像您所做的那样。
问题可能是您的类不支持您需要的所有功能。尽量避免直接使用 member 并将其用法包装到虚方法中。在派生类中重新实现这些方法。
如果这仍然不是一个选项,请考虑提取成员的方法。也许是经过适当转换的虚拟 getter 和 setter。
作为最后的手段,考虑 boost::variant、boost::any。但实际上它们是使用类似于包装器的技术实现的。所以你得到了包装器的包装器。
关于c++ - 多态设计,模板作为抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971833/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!