C ++中类的多个接口

时间:2013-07-22 18:24:48

标签: c++ interface polymorphism

我有三个相互作用的类如下。 Class A包含Class B类型的私有成员。它还包含一个传递类型ClassC的对象的方法。然后,此方法在ClassC上调用方法,并向其传递ClassBInterface1类型成员的特定接口(ClassB):

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

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

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

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

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

你的方式是最好的,但你可以做一点修改。调用ClassB时,您无需从ClassBInterface1ObjectC.Bar进行显式转换,因为编译器会为您执行此操作。

如果class B定义如下:

ClassB : public ClassBInterface1, ClassBInterface2
{

  /*Class methods and attributes*/

}

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

ObjectC.Bar(ObjectB);

答案 1 :(得分:0)

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现在只保留在施工时给予他的任何参考。

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