【发布时间】:2016-11-22 12:01:24
【问题描述】:
我正在尝试为 C++ 中的类提供多个接口的问题提出一个优雅的解决方案。 假设我们有 B、C 和 D 类。B 和 C 需要对 A 类进行自定义/受控访问,而 D 可以直接访问。提供此类接口的解决方案需要可扩展。未来的接口可能只针对一个特定的类。
目前,我正在创建引用类 A 的接口类(IA_1、IA_2)。B 和 C 将提供这些接口的实例,并且可以通过 IA_1 和 IA_2 以自定义/受控方式访问 A。情况如下图所示。
这样做的好处是我在实现新接口时不需要接触 A 类。新接口可以通过继承利用旧接口。需要访问 A 的类只能通过其特定的接口进行。
C++ 中的实现如下所示:
class A{
public:
void foo();
};
class IA_1{
public:
void foo(const B& b);
private:
std::weak_ptr<A> m_A;
};
class IA_2{
public:
void foo();
private:
std::weak_ptr<A> m_A;
};
class B{
std::unique_ptr<IA_1> m_A;
};
class C{
std::unique_ptr<IA_1> m_A;
};
class D{
std::weak_ptr<A> m_A;
};
接口获取到 A 的 weak_ptr 是因为我不希望只访问 A 的类参与其生命周期管理。
目前我正在为 B 或 C 的每个实例创建一个接口对象,尽管它们都在做同样的事情。我已经考虑过只创建一个接口对象,并为 B 和 C 的每个实例提供相应接口的引用 (shared_ptr)。这样,每个接口我都只有一个对象。也许这已经是一个过早优化以减少应用程序内存占用的案例。
有没有办法进一步改进这种设计或采取完全不同的方法?
【问题讨论】:
-
您的 UML 令人困惑,因为连接线颠倒了 (see wikipedia)
-
对我来说似乎是过早的悲观。拥有 N 个指向对象的弱指针比拥有 N 个指向指向对象的弱指针的共享指针要好。
-
@stefaanv 你是对的。我已经更正了 UML 图。
-
是的,更清晰
-
您似乎在暗示
A是单身人士?或者你只是说每个A有很多Bs和Cs?