2011-07-21 22 views
5

私は30の何かを純粋に仮想メソッド*で書いています。 MSVC++は大きな抽象基底クラス

あなたはコンパイラエラーで実装するのに失敗した関数は「抽象クラスを作成することはできません」を教えてくれていない主な理由は実装クラスに基底クラスで実装するすべての機能を見つける

は、少し面倒です

私は大きな抽象基底クラスが悪い考えか、それをいくつかのインターフェースに分割すべきか、あるいはコンパイラが警告を発することができますか? ..またはこれは抽象クラスでのコーディングの一部であり、私はそれに慣れるべきです。

*これは、いくつかの異なるレンダリングサブシステム間に共通の機能のレイヤーを提供します。

+2

私のMSVCはどの機能が抽象であるかを教えてくれます。 – Puppy

+1

インターフェイスを分割してコンポーネントをクリアすることができます。私はこれには合理的な理由があると主張しませんが、それは明らかに良いことだと思います。 –

答えて

4

この質問には明らかな正解はありません。基本クラスを複数の抽象基本クラスに分解するかどうかは、基本クラスが論理的にであるかどうかに基づいて判断する必要があります。あなたがこれを行う唯一の理由がコンパイラのエラーメッセージの場合は、コンパイラをアップグレードできるかどうか、またはこれを行う他の理由があるかどうかを確認したい場合があります。現代のコンパイラのほとんどは、これに関する非常に素晴らしい、詳細なエラーを提供する必要があります。

基本クラスの小さな部分だけを実装する複数の異なるクラスを実際に作成したい場合は、インターフェイスを複数に分割することをお勧めします。これを行うと予想される場合は、インタフェースを分離することが有利な場合があります。しかし、これからいくつかの複雑さが増してきます。たとえば、複数のインターフェイスを実装するオブジェクトに対して1つのインターフェイスタイプのポインタがある場合、正しい型を取得するために何らかのクロスキャストを実行する必要があるか、継承するものを表す新しい抽象クラスを導入する必要があるかもしれませんすべての異なるインターフェイスタイプから選択できます。インターフェイスクラスが複数設計されている場合は、通常は問題にはなりませんが、インターフェイスクラスを複数継承するといくつかの名前の衝突が発生する可能性があります。

要するに、私は、コンパイラエラーの理由でこのことをしないことを強くお勧めします。しかし、それが良い設計の決定だと思うなら、是非ともそれを検討してください。コンパイラは、まれに(まったく)決してあなたの周りにあなたのデザインを構築する必要はありません。

4

私の意見では、インターフェイスクラスは本質的に悪いですが、この特定のアプリケーションのサウンドは疑わしいものです。

このインターフェイスから派生したクラスがあり、どの関数をオーバーライドする必要があるのか​​が明確でない場合は、それらの関数がすべて必要でない可能性があるようです。

抽象基本クラスを作成するとき、純粋仮想メソッドの数は(私にとって)重要ではありませんが、このインターフェイスから派生するすべてのクラスがそれぞれの純粋仮想関数を実装する必要がある理由は明らかです。 「なぜこの関数を実装する必要があるのですか?」と思っている場合は、抽象クラスをいくつかの異なるインターフェイスに分割するのが適切かもしれません。

+2

最後の段落は本当にここで問題の勇気を得ます。 –

0

とにかくこのような大きなクラスは混乱、神クラスの敵対者です。クラスを分割し、ソリッドの開発原則を見て集計/構成を使用して、単一のクラスのための30のメソッドのように見えるのは、少なくとも1つの責任原則に従っていない...ので、私はクラスのデザインを再考することをお勧めします。がんばろう!

0

通常、インプリメンテーションを記述する前にインターフェイスをコピーして貼り付けた場合、「抽象クラスをインスタンス化できません」というエラー(コードが呼び出された行でスローされます)の直後に、リンカーエラーが発生しますあなたが実装するのを忘れた方法を指し示す「未解決の外部エラー」。

関連する問題