0

我有一个接口和一些实现。但在一个实现中,我有一个指定功能,仅在该实现中使用。

class Interface
{
    virtual void foo() = 0;
}

class D1 : public Interface
{
    void foo() {}
}

class D2 : public Interface
{
    void foo() {}
    void bar() {}
}

所以我只有在 D2 中有一个 D2::bar() 函数,它只为 D2 实现指定。使用 OOP 编写这类东西的正确方法是什么?

在我的客户端代码中,我有一个电话:Interface* i; i->foo();

但如果它是“i”中的 D2,在某些情况下我需要调用 bar() 函数。

4

5 回答 5

1

如果你需要调用 bar 函数,你需要有一个知道 bar 的对象的引用。

所以,要么你引用一个 D2 对象,要么你的接口必须包含一个 bar 函数。在后一种情况下,您的 D1 也必须实现它,但实现可以为空或返回错误值。

于 2012-08-31T07:52:57.097 回答
0

如果你坚持使用接口,你应该bar进入一个专用接口,然后让客户使用它:

class FooInterface {
public:
    virtual void foo() = 0;
};

class BarInterface {
public:
    virtual void bar() = 0;
};

class D1 : public FooInterface {
public:
    void foo() {}
};

class D2 : public FooInterface,
           public BarInterface {
public:
    void foo() {}
    void bar() {}
};

然后,您需要实现的客户端代码bar可能需要一个BarInterface.

于 2012-08-31T07:54:13.923 回答
0

假设您从接口继承 D1 和 D2。您可以使用强制转换将基指针转换为派生对象并使用它,前提是基指针指向D2

于 2012-08-31T07:54:59.500 回答
0
class _interface
{
    virtual void foo() = 0;
};

class _abstract : public _interface
{
public:
    _abstract(){}
    virtual ~_abstract(){};

    virtual void foo() = 0;
    int get_type()
    {
        return i_type;
    }

protected:
    int i_type;
};

class D1 : public _abstract
{
public:
    D1(){
        i_type = 1;
    }
    ~D1(){}

    void foo() {
        // do something
    }
};

class D2 : public _abstract
{
public:
    D2(){
        i_type = 2;
    }
    ~D2(){}

    void foo() {
        // do something
    }

    void bar() {
        // do something
    }
};
int main()
{
    D1 d_one;
    D2 d_two;

    _abstract* ab = &d_one;
    cout << ab->get_type() << "D1" << endl;

    ab = &d_two;
    cout << ab->get_type() << "D2" << endl;

    return 0;
}

您可以通过 get_type() 来识别哪个孩子。所以,你知道什么时候可以使用 bar()。我不知道什么是最好的方法。

于 2012-08-31T10:20:41.000 回答
0

如果你准备在你的界面中有一些通用的实现,你可以在你的界面中放置一个 bar() 的空实现:

class Interface
{
    virtual void foo() = 0;
    virtual void bar() {}
}

class D1 : public Interface
{
    void foo() {}
}

class D2 : public Interface
{
    void foo() {}
    void bar() {}
}

现在当你调用 Interface i* = blah; 我->酒吧();如果 i 是 D1 它什么也不做,如果 i 是 D2 它会做一些 D2 特定的事情。

于 2012-08-31T09:07:36.733 回答