【问题标题】:Multiple Interfaces to a Class in C++C++ 中一个类的多个接口
【发布时间】:2013-07-22 18:24:48
【问题描述】:

我有三个类交互如下。 Class A 包含 Class B 类型的私有成员。它还包含一个传递ClassC 类型对象的方法。然后,此方法调用ClassC 上的方法,将其类型为ClassB 的成员的特定接口(@98​​7654325@)传递给它:

 ClassA
 {
     void Foo(ClassC ObjectC)
     {
         ObjectC.Bar((ClassBInterface1) ObjectB);
     }
     ClassB ObjectB;
 }

我的问题是:ClassA 不需要访问Interface1 中定义的ClassB 的方法。因此,在我看来,如果ClassA 的成员是ClassBInterface2 类型,而不是ClassB,会更优雅。在Interface1 下仍将 B 传递给 C 的同时是否可以这样做?

我能想到的唯一方法是在ClassA 的Bar 方法中将ClassBInterface2 类型转换为ClassB 并返回ClassBInterface1

这是最好的方法吗?还是我应该保持原样?

非常感谢您的帮助。

【问题讨论】:

  • 你的上下文中的类接口是什么:s?我最好的猜测是你过度设计了,但这个问题太抽象了,很难回答。
  • 不要将一个接口类型转换成另一个接口类型,这违背了独立性的目的,我建议保持原样,或者将两种接口类型的 2 个引用保留到同一个对象。

标签: c++ interface polymorphism


【解决方案1】:

如果您将ObjectB 定义为ClassBInterface2,则无法在运行时将其转换为ClassBInterface1,因为它的内部结构是未知的。

你的方式是最好的,但你可以做一些修改。在调用ObjectC.Bar 时,您不需要从ClassBClassBInterface1 进行显式转换,因为编译器会为您完成。

如果class B定义如下:

ClassB : public ClassBInterface1, ClassBInterface2
{

  /*Class methods and attributes*/

}

您可以在 ObjectC 上调用 Bar 函数时执行以下操作(假设 objectB 定义为 ClassB

ObjectC.Bar(ObjectB);

【讨论】:

    【解决方案2】:

    C++ 对此有一个很棒的特性,称为“前向声明”。基本上,对于不需要知道类细节的代码的任何部分,您可以简单地传递一个引用。只有当你想调用成员方法(包括构造函数和析构函数)时,你才需要有完整的类定义。

    #include "ClassC.h"
    class ClassB;
    
    class ClassA
    {
    public:
        void foo(ClassC& objectC)
        {
           objectC.bar(_objectB);
        }
    
    protected:
        ClassB& _objectB;
    };
    

    请注意,我们包含 ClassC 的标头,因为我们需要调用他的方法之一。

    请注意,我们转发声明 ClassB 并且只持有一个引用,因为我们并不真正关心他是什么。

    最后请注意,ClassA 目前无法实例化,因为必须以某种方式将 _objectB 的引用设置为某个值。例如构造函数:

    public ClassA(ClassB& objectB)
        : _objectB(objectB)
    {}
    

    ClassA 现在只保留在构造时给予他的任何参考。

    根据您在问题中使用术语“接口”,我假设您可能有一个类层次结构。这个答案可以很容易地扩展到这样的层次结构。但这里重要的一点是,具体类型总是需要类定义,而简单引用对象只需要前向声明。

    【讨论】:

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