C++重构常用方法/逻辑,不污染接口

问题描述 投票:0回答:1
  • 我有一个界面:
class FooInterface {
  virtual void Method1(bool method) = 0;
};
  • 我有多个实现此接口的派生类,它们都有共同的逻辑/方法[方法1]:
class BarClass1 : FooInterface {
  void Method1(bool method) final {
    if (method) {
      Method2();
    } else {
      Method3();
    }
  }
    void Method2() {// BarClass1 logic};
    void Method3() {// BarClass1 logic};
};

class BarClass2 : FooInterface {
  void Method1(bool method) final {
    if (method) {
      Method2();
    } else {
      Method3();
    }
  }
  void Method2() {// BarClass2 logic};
  void Method3() {// BarClass2 logic};
};
  • 我想重构通用逻辑而不污染我的界面。

将通用逻辑移至 AbstractClass 是否有意义,或者是否有更优化的设计模式?

class FooAbstractClass : FooInterface {
  void Method1(bool method) final {
    if (method) {
      Method2();
    } else {
      Method3();
    }
  }

  virtual void Method2() = 0;
  virtual void Method3() = 0;
};

class BarClass1 : FooAbstractClass {
    void Method2() final {// BarClass1 logic};
    void Method3() final {// BarClass1 logic};
};

class BarClass2 : FooAbstractClass {
    void Method2() final {// BarClass2 logic};
    void Method3() final {// BarClass2 logic};
};

预期用途:

BarClass1 bar1;
bar1.Method1(true);

BarClass2 bar2;
bar2.Method1(false);
c++ oop design-patterns interface abstract-class
1个回答
0
投票

一个可能的解决方法是为 Method2

Method3
函数提供
另一个
接口类。然后创建一个
BarBase
类,它继承 both 接口,但也定义(实现)来自
Method1
FooInterface

然后两个

BarClass1
BarClass2
类继承
BarBase
并分别以自己的方式实现
Method2
Method3

也许是这样的:

struct BarInterface
{
    void Method2() = 0;
    void Method3() = 0;
};

struct BarBase : public FooInterface, public BarInterface
{
    void Method1() override final { /* Call Method2 or Method3... */ }
};

class BarClass1 : public BarBase
{
public:
    void Method2() override final { /* ... */ }
    void Method2() override final { /* ... */ }
};

class BarClass2 : public BarBase
{
public:
    void Method2() override final { /* ... */ }
    void Method2() override final { /* ... */ }
};

This way you can still use pointers to (for example) a `BarClass1` object when passing it to functions wanting a pointer to a `FooInterface`.
© www.soinside.com 2019 - 2024. All rights reserved.