7

多くの場合、Qt クラスをオーバーライドして、その動作を拡張または変更したいと考えています。しかし、ほとんどすべての Qt クラスは、QNetworkDiskCache 内で QNetworkDiskCachePrivate などの内部プライベート クラスを使用します。このアプローチには利点があることを私は知っています。しかし、private クラスには大きな問題があります。クラスのオーバーライドが非常に難しくなります。ソース コードを含む他の C++ クラス ライブラリでは、通常、クラス メソッドをオーバーライドし、親クラスの実装からコードをコピーし、必要な動作を実現するためにあちこちで小さな変更を加えます。ただし、Qt では、プライベート クラスはエクスポートされず、派生クラスには表示されません。Qt クラスは "d" メンバーを介してプライベート クラスで重要な内部データを保持するため、プライベートな内部クラスの不可視性により、動作拡張の可能性が非常に制限されます。いくつかの公開された public メソッドでのみ遊ぶことができます。

クラスのソース ファイル全体を抽出し、クラス名とファイル名の名前を変更してみました。しかし、Qt クラス ライブラリは非常に複雑に絡み合っているため、ほとんどの場合、そこから単一のクラスを抽出するのも面倒です。

ここで何かが恋しいですか?それとも、Qt クラスは拡張性の点で本当に悪いのでしょうか?

4

2 に答える 2

1

Qtクラスは、拡張性の点で他のクラスよりも優れています。多くの場合、メソッド全体をコピーして貼り付けることなく、動作を変更するためのフックがあります。そうは言っても、一般的に受け入れられている拡張方法が機能しない場合は、Qtクラスをハッキングするのは難しくなります。基本クラスの実装をコピーして貼り付けて変更すると、派生クラスは基本クラスの実装で行われた改善やバグ修正を取得できないため、これはおそらく良いことです。

それを実行したい場合は、ビルドシステムを説得して、プライベートヘッダーを含めてから、新しい実装からプライベートクラスを参照できるようにする必要があります。Qtドキュメントの免責事項に注意してください。これを行うと、リリースされるすべての新しいバージョンのQtで破損する可能性があります(QtはパブリックAPIのみを保証し、その内部をいじっています)。QtのパブリックAPIは素晴らしく読みやすく、文書化されています。内部コードはかなり不可解である可能性があるため、パブリックAPIを使用して目的を達成できないことを本当に確認する必要があります。それでもプライベートクラスのものを使用することに解決した場合は、これが役立つ可能性があります

于 2012-10-17T14:40:59.700 に答える
-2

あなたのアプローチは間違っていて悪いです!Qt、さらに一般的な C++ コードを拡張するために、ソース コードをコピーして必要な場所を変更する必要はありません。拡張 OOP (オブジェクト指向プログラミング) パラダイムを使用する必要があります。C++ では、次のように記述します。

#include <iostream>

using namespace std;

class A
{
public:
    A(){x=1;}
    void writeName(){cout << "my name is A";}
    void writeNumber(){cout << "my number is " << x << endl;}
private:
    int x;
};

class B : public A
{
public:
    B(){}
    void writeName(){cout << "my name is B and i'm better then A" << endl;}
};

int main()
{
   B *b= new B();
   b->writeName();
   b->writeNumber();
   return 0;
}

//output:
my name is B and i'm better then A
my number is 1

このようにして、Bは基本クラスAが行うすべてのことを行い、ニーズに合わせてメソッド(基本クラスを拡張)を追加します。qt のサンプル コードを見ると、これは通常、デフォルトの qt ウィジェットの動作に含まれていないことを行うために使用されるアプローチです。ItemDelegate のカスタマイズの例では、QItemDelegate を拡張する独自のクラス MyItemDelegate を記述します:リンク

それとも、Qt クラスは拡張性の点で本当に悪いのでしょうか?

Qt は、C++ 言語を構築するフレームワーク「のみ」です。つまり、C++ でできることはすべて Qt でできるということです。

于 2012-10-17T09:28:26.957 に答える