【发布时间】:2018-01-10 08:51:34
【问题描述】:
我有一点设计问题。
假设我有这个接口:
class IBase {
public:
virtual void Run() = 0;
virtual void DoSomethingWithData(IData* data) = 0;
virtual ~IBase() = 0;
};
我想实现派生类,所以我需要为IData构建一个派生类(我们称之为DData)。 IData 基本上是一个空接口:
class IData {
public:
IData();
virtual ~IData() = 0;
};
问题是在我实现的 DoSomethingWithData 方法中 - 我需要引用 DData 中的特定成员,但我不能因为指针是 IData 。例如,查看某些派生类中 DoSomethingWithData 的实现:
class DData : public IData {
private:
int m_i;
};
<Derived.h : IBase>
Derived::DoSomethingWithData(IData* data) {
some_function_call(data->m_i) // cannot be used by the base ptr
}
解决这个问题的最佳方法是什么?
SetData 上的动态转换? 更改界面(以这种方式?)? 其他选择?
编辑:
为了澄清问题: 我有这种关系 -
class A -> uses DataA
class B -> uses DataB
class C -> uses DataC
这些类有一个通用接口:Run、DoSomethingWithData。 DoSomethingWithData 期望数据,但它不知道数据是什么,它取决于我们实现的类。 我需要找到编写接口的最佳方式,而不是使用像 dynamic_cast 这样糟糕的 OOP 技术。
【问题讨论】:
-
您的问题不清楚。请提供一些关于设计应该可以做什么的解释,也许应该用设计来防止什么。你能提供代码来演示应该如何使用设计吗?
-
如果要对所有类进行不同的处理,那么
IData真的不是它们的接口。空接口本身就是可疑的——这些类有什么共同点?什么都没有? -
IBase 说它接受一个指向 IData 的指针。 每个子必须接受指向IData的any指针。您不能选择“D1Derived 将接受指向 D1Data 的指针,而 D2Derived 将接受指向 D2Data 的指针”。这是他们应该在 OO 编程课程中教授的第一件事,但不知何故没有人这样做,所以我必须为他们所有,坦率地说我厌倦了它。
-
@n.m.所以你建议从接口中删除 DoSomethingWithData 函数,并在每个派生类中使用合适的 DData 实现它?
-
叹息。回到一号广场。如果您希望每个派生类都接受 any 类型的 IData,请继续在您的基类中声明您的方法。否则,您的派生类没有实现相同的接口,并且您没有任何东西可以放入基类中。
标签: c++ design-patterns interface