1

インターフェイスと使いやすさを目的として、抽象基本クラスを使用したいと考えています。この抽象基本クラスは、いくつかの異なる派生クラスの親クラスとして使用されます。各派生クラスには、抽象基本クラスの純粋仮想関数の特定のサブセットが必要です。私のスキームの概要は以下の通りです。

抽象クラス.hpp

AbstractClass{
/* Declaration */
void pureVirt1() = 0;
void pureVirt2() = 0;
void pureVirt3() = 0;
};

派生クラス1.hpp

DerivedClass1{
/* Declaration */
void pureVirt1();
};

派生クラス2.hpp

DerivedClass2{
/* Declaration */
void pureVirt2();
};

派生クラス3.hpp

DerivedClass3{
/* Declaration */
void pureVirt3();
};

現在の実装では、上記のクラスはすべて抽象クラスであり、これらのクラスからオブジェクトを作成することはできません。過去に、私はこの問題を各仮想関数の周りのプリプロセッサ ディレクティブで解決しました。

抽象クラス.hpp

AbstractClass{
#ifdef _1
void purVirt1()=0;
#endif
...

そして、各派生クラスのヘッダー ファイルの先頭で、abstractclass.hpp へのインクルードの前に、次のように記述します。

派生クラス1.hpp

#define _1
#include"abstractclass.hpp"
...

これは、小さなプロジェクトで作業していて、make ファイルを作成していないときに機能しました。抽象クラスのヘッダーは、ディレクティブを正しい場所に保持している限り、どの派生クラスがそれを使用しているかに基づいて効果的に変更されました。メイクファイルを使用しているため、これは機能しません。abstractcalss.cpp は、派生クラスとは別にコンパイルされるため、ヘッダー ファイルに仮想関数を含めずにコンパイルされます。これに対する適切な回避策を探しています。

この機能が欲しいのは、私が作成した他のさまざまなツールで使用される、この抽象基本クラスからの同様の派生クラスが多数あるためです。これらの他のツールをできるだけシンプルに保ち、すべてのテンプレート クラスを記述する代わりに、抽象クラスへのポインターを使用するだけにしたいと考えています。

-- 詳細情報 AbstractClass が SubAbstractClass との has-a 関係にあり、AbstractClass に SubAbstractClass へのポインターを使用して実装されている状況があります。さらに、各派生クラスには、SubDerivedClass1、SubDerivedClass2 などと同様の has-a 関係があります。特に、派生クラスを組み合わせて新しいクラスを作成できるため、作成する新しいクラスごとにコンテナーを記述したくありません。これらは重要で機能的であり、そのような新しいクラスの組み合わせには、適切なサブクラスのセットを作成する必要があります。この目的のために、ABC を使用してポインターを一度宣言すれば、任意の派生クラスで機能すると便利です。

4

2 に答える 2

0

共通の基本クラスから始めます。

class AbstractBaseClass {
  // common stuff goes here
};

次に、サブバージョンの抽象インターフェイスを作成します。

class AbstractSubClass1:public AbstractBaseClass {
public:
  void pureVirt1() = 0;
};
class AbstractSubClass2:public AbstractBaseClass {
public:
  void pureVirt2() = 0;
};
class AbstractSubClass3:public AbstractBaseClass {
public:
  void pureVirt3() = 0;
};

抽象pureVirtメソッドが含まれています。

最後に、サブクラスから実装クラスを派生させます。

class Derived1 : public AbstractSubClass1 {
  virtual void pureVirt1() override; // override if your compiler supports it
};
class Derived2 : public AbstractSubClass2 {
  virtual void pureVirt2() override; // override if your compiler supports it
};
class Derived3 : public AbstractSubClass3 {
  virtual void pureVirt3() override; // override if your compiler supports it
};

現在、特定のサブクラスであることを認識しているオブジェクトは、メンバーにアクセスできますpureVirtX。共通インターフェースにアクセスできるだけではないものAbstractBaseClass(それが何であれ - 一部のコードはこれらの特定のメソッドについて知る必要がないことに言及していvirtualます)。

于 2013-06-28T18:59:40.647 に答える