【问题标题】:Multiple interfaces to one class一个类的多个接口
【发布时间】: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?

标签: c++ c++11 interface c++14


【解决方案1】:

可能不是一个完整的答案,只是我的想法。

缺点:

  • 引入了额外的接口类
  • 额外间接,每次支持的调用都需要额外维护
  • 构造:指向对象的接口需要额外的工厂
  • 弱指针:解决指针悬空的情况

优点:

  • 清除对类接口的控制
  • 生命周期内的额外安全性(可以检查,但也应该处理)
  • 对象(朋友?)需要进行有限更改

关于每个接口 1 个实例:占用空间会稍微低一些,但您需要对访问该 1 个实例进行额外管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多