【问题标题】:how to achieve interface segregation with polymorphic behavior c++如何使用多态行为c ++实现接口隔离
【发布时间】:2015-05-18 15:41:17
【问题描述】:

假设您有两个函数fun1fun2。有两个类der1der2der1der2 都实现了 fun1,但只有 der2 实现了 fun2。但是我需要使用指向der1der2base 指针来进行多态行为。即使只有der2 会同时使用这两个函数,在基类(抽象)中同时拥有这两个函数是否有意义?

der1der2 是相关的,我认为der2 应该包含der1。但即便如此,基类也需要声明fun1fun2。如何实现ISP?下面的代码看起来不错还是有办法以更好的方式对其进行重组?

class base // Abstract
{
public:
virtual void fun1() {//default implementation}    
void fun2(){ // used by only der2}
};

class der1 : public base
{
//this also have fun2 as its defined in base.
}

class der2 : public base
{
// should implement fun1 and fun2 both 
public:
void fun2() { //implements fun2.}
}

【问题讨论】:

    标签: c++ oop interface


    【解决方案1】:

    不,如果有一个派生类没有实现这两个函数,那么将两个函数都放在一个基类中是没有意义的。这将不符合 Liskov 替换原则。

    我建议使用层次结构的接口:

    struct base1
    {
        virtual void fun1();
    };
    
    struct base2 : public base1
    {
        virtual void fun2();
    };
    
    class der1 : public base1
    {
    public:
        virtual void fun1() override;
    };
    
    class der2 : public base2
    {
    public:
        virtual void fun1() override;
        virtual void fun2() override;
    };
    

    base1* 可以指向der1der2,因此只有fun1

    base2* 同时具有fun1fun2,因此只能指向der2

    【讨论】:

      【解决方案2】:

      接口隔离原则解决了客户端函数或类仅使用它们所依赖的接口中所有方法的子集的问题。例如,想象以下情况:

      在这种情况下,两个“客户端”类都依赖于整个“BigInterface”API,而它们实际上只需要一部分方法。在这种情况下,最简单的解决方案是“拆分”大界面并创建有凝聚力的界面,例如:

      在您的特定情况下,这取决于谁使用der1der2base。如果没有更多上下文信息,很难知道您的代码是否看起来不错,但假设您的客户端类依赖于base,即使它们只需要fun1fun2,您应该应用与示例中类似的配方,并将您的界面一分为二。

      希望对你有帮助:)

      【讨论】:

      • 感谢您的回复。拆分接口的问题是,如果我的基类没有 fun1 和 fun2,我将无法多态地使用基指针。der1 和 der2 继承了基类。如果我隔离接口,比如 class der1interface{ void fun1(); } ;类 der2-interface {void fun1();无效的乐趣2(); };类基:公共组合接口{}; // 将有 der1 类不需要的 fun2。 class der1 : public der1_interface {};// 不与 der1 多态相关 class der2 : public der2_interface {}; // 与 der1 没有多态关系
      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多