9

単純なクラスをコーディングして使用する方法を知っており、継承がどのように機能し、どのように使用するかについても知っています。しかし、クラス階層の構造を実際に設計する方法や、単純なクラスを設計する方法についてのガイドは非常に限られています。また、いつ、なぜクラスを継承 (または使用) する必要がありますか?

ですから、私は実際にどのように尋ねているのではなく、いつなぜなのかを尋ねているのです。サンプル コードは常に良い学習方法ですので、ぜひ参考にしてください。また、いつ、なぜなのかを一言で説明するのではなく、設計の進行状況を強調してください。

私は主に C++、C#、および Python でプログラミングしていますが、ほとんどの言語で簡単な例を理解できるでしょう。

用語のいずれかが混同されているように思われる場合は、お気軽に私の質問を編集してください。私はネイティブではないので、すべての単語がわかりません。

4

5 に答える 5

11

C++ は継承とクラスに大きく依存しているため、サンプル言語として C++ を使用します。これは、Windows などの単純な OS 用のコントロールを作成する方法に関する簡単なガイドです。コントロールには、ボタン、スライダー、テキスト ボックスなど、ウィンドウ上の単純なオブジェクトが含まれます。


基本クラスの構築。

ガイドのこの部分は、(ほぼ) すべてのクラスに適用されます。十分に計画されていても、半分は完了していることを忘れないでください。私たちはどのようなクラスに取り組んでいますか?その属性と必要なメソッドはどれですか? これらは、私たちが考える必要がある主な質問です。

ここでは OS コントロールに取り組んでいるので、単純なクラスから始めましょうButton。では、ボタンの属性は何でしょうか? 明らかにそれpositionは窓に必要です。また、すべてのボタンを正確に同じサイズにしたくないのでsize、他の属性も同様です。ボタンも「必要」labelです(ボタンに描かれたテキスト)。これが各クラスで行うことであり、設計してからコーディングします。必要な属性がわかったので、クラスを作成します。

class Button
{
    private:
        Point m_position;
        Size m_size;
        std::string m_label;
}

コードを短くするために、すべてのゲッター、セッター、およびその他のメソッドを省略していることに注意してください。ただし、それらも含める必要があります。Pointまた、クラスがあることも期待していSizeますが、通常は自分で構造化する必要があります。


次のクラスに移動します。

1 つのクラス ( Button) が終了したので、次のクラスに移ることができます。Sliderたとえば、ウェブページを上下にスクロールするのに役立つバーです。

ボタンの場合と同じように始めましょう。スライダー クラスには何が必要ですか? positionウィンドウとsizeスライダーの位置 ( ) があります。また、最小値と最大値があります (最小値はスクローラーがスライダーの上部に設定されていることを意味し、最大値はスライダーが下部にあることを意味します)。現在の値、つまりスクローラーが現在どこにあるかも必要です。今はこれで十分です。クラスを構築できます。

class Slider
{
    private:
        Point m_position;
        Size m_size;
        int m_minValue;
        int m_maxValue;
        int m_currentValue;
}

基底クラスの作成。

2 つのクラスを取得したので、最初に気付くのは、両方のクラスでPoint m_position;およびSize m_size;属性を定義したことです。これは、共通の要素を持つ 2 つのクラスがあり、同じコードを 2 回記述しただけであることを意味します。コードを 1 回だけ記述して、両方のクラスに、書き直す代わりにそのコードを使用するように指示できたら素晴らしいと思いませんか? まあ、できます。

共通の属性を持つ 2 つの類似したクラス (この場合はButtonSlider. sizeこれらは両方とも、とを備えた OS のコントロールpositionです。これから、 と呼ばれる新しいクラスを取得しますControl

class Control
{
    private:
        Point m_position;
        Size m_size;
}

共通の基本クラスから同様のクラスを継承します。

Controlすべてのコントロールに共通の項目を含むクラスを取得したので、それを継承するようにButtonandを指定できます。Sliderこれにより、時間、コンピューターのメモリ、そして最終的には時間を節約できます。新しいクラスは次のとおりです。

class Control
{
    private:
        Point m_position;
        Size m_size;
}

class Button : public Control
{
    private:
        std::string m_label
}

class Slider : public Control
{
    private:
        int m_minValue;
        int m_maxValue;
        int m_currentValue;
}

2 回書いてクラスを作成するPoint m_position; Size m_size;よりも、2 回書く方がはるかに簡単だと言う人もいるかもしれません。これが当てはまる場合もありますが、特にクラスを作成する場合は、同じコードを 2 回記述しないことをお勧めします。: public ControlControl

さらに、最終的にいくつの共通属性が見つかるかは誰にもわかりません。後で、コントロールが保持されているウィンドウ (またはパネルなど) を指すクラスControl* m_parentのメンバーが必要であることに気付くかもしれません。Control

もう1つのことは、後で の上に がSlider必要Buttonであることに気付いた場合、すべてのクラスでサイズ、位置、および親の代わりに、テキストボックス固有のメンバー変数のみを記述して記述するだけでTextBox、テキストボックスコントロールを作成できることです。 class TextBox : public Control { ... }.


最終的な考え。

基本的に、共通の属性またはメソッドを持つ 2 つのクラスがある場合は常に、基本クラスを作成する必要があります。これが基本ルールですが、例外もあるかもしれませんので、自分の頭脳を使っても構いません。

私自身もプロのコーダーではありませんが、学んでおり、教育者が私に教えてくれたように、すべてをあなたに教えてきました. あなた(または少なくとも誰か)がこの回答が役立つことを願っています。また、Python やその他のダック タイピング言語は継承を使用する必要さえないと言う人もいますが、それらは間違っています。継承を使用すると、大規模なプロジェクトで時間とお金を大幅に節約でき、最終的には基本クラスを作成してくれたことを感謝することになります。プロジェクトの再利用性と管理が何十億倍も簡単になります。

于 2013-04-21T18:17:03.507 に答える
1

1 つのクラスの属性を含む 2 つのクラスがある場合、または一方が他方に依存している 2 つのクラスがある場合は、継承を使用する必要があります。例えば)

class animal:
    #something
class dog(animal):
    #something
class cat(animal):
    #something

ここでは、クラスの属性を持つ犬と猫の 2 つのクラスがありますanimal。ここでは、継承がその役割を果たします。

class parent:
    #something
class child(parent):
    #something

ここで、親と子は 2 つのクラスであり、子は親に依存し、子は親の属性と独自の属性を持ちます。したがって、ここでは継承が使用されます。

于 2013-04-21T15:42:33.767 に答える