3

この問題に対してどちらがより良い方法か知りたいです:

教師は、複数の科目を教えることも、ラボで複数の科目を受講することも、両方とも研究所に所属することもできます。Lab、、には他SubjectTeacherもいくつかの変数があります。私はそれらすべてをここに書いたわけではありません。新規lab,subject and teacherは個別に追加できます。教師が追加されると、Teacher classandlabCodeと。のすべての変数のみを入力しますsubCode。事前定義されたラボとサブジェクトと、後で追加されるラボとサブジェクトがあります。可能であれば、彼の研究室と教科の詳細を示す教師の記録を見ることができます。

私のC++の概念はそれほど強力ではなく、どちらがこれに適しているかわかりません。TeacherクラスでLabクラスとSubjectクラスへのポインタを指定する必要がありますか、それともそれらを固有にする必要がありますか、それともこれを行うためのより良い方法がありますか。

class Lab{
    char labCode[20];
    char labName[40];
        int labYear;
    //here default constructor 
};
class Subject{

    char subCode[20];
    char subName[20];
        int subYear;
    //here default constructor 
};
//-------------------------------------
class Teacher{
    char facName[30];
    int teacherSubCount;
        int teacherLabCount;
    Subject *subject;
        Lab *lab;
    //here default constructor 

};
//------------or should i do like this--------------
class Teacher:public Lab,public Subject{
   char teacherName[30];
    int teacherSubCount;
        int teacherLabCount; 
   //here default constructor 

};

私の本が「ポインターは非常に強力なc++です」と述べているように、私がポインターの力を学ぶことができるようにチュートリアルを提案することができれば、それらはいくつかの簡単な例を与えるだけです:)

4

6 に答える 6

4

「「クラス継承」よりも「オブジェクトコンポジション」を優先します。」-ギャングオブフォー

ただし、クラスに固有のものとして、最初に自問してみてください...「教師はラボの一種ですか、それとも教科の一種ですか?」明らかに、答えは「いいえ」です。

継承モデルでは、子クラス自体が親クラスのインスタンスである必要があります。リスコフの置換原則を考慮すると、その子オブジェクトはその親オブジェクトとして扱われる必要があります。したがって、を探しているコードがあるSubject場合は、それを渡すことができますTeacher。直感的には、これはあまり意味がなく、モデル化されている実際のドメインエンティティを正確に表したものではありません。

この場合、クラスの継承ではなく、オブジェクトコンポジションが必要です。はTeacher a Lab持ち、は、 Subjectではなく Labまたはです Subject。実際、が複数のsまたはsを持つTeacherことができる場合、構成は単一のインスタンスクラスメンバーからある種の配列またはリストに単純に変更されます。その場合、継承アプローチは完全に機能しなくなります。LabSubject

このような現実世界の概念を表すオブジェクトをモデル化するときは、それらの現実世界の概念の直感を第一に考え、実装への技術的な近道を第二に考慮してください。モデル化されているものに関して意味がない場合は、コードでも意味がありません。

于 2012-08-14T15:46:47.500 に答える
3

提案されたソリューションで、「is-a」(継承の場合)と「has-a」(集約の場合)の関係が意味をなすかどうかを検討してください。

ATeacherはaLabでもaでもありませんSubject-集約ソリューションを使用する必要があると思います。

ただし、コードを開始する前に完全にソートする必要があるのは、データモデルです。オブジェクト間の関係と多重度(つまり、1対1、1対多など)を特定する必要があります。

于 2012-08-14T15:41:20.213 に答える
3

継承は「is-a」関係を意味し、ポインターは「has-a」関係を意味します。

先生は研究室ですか?先生は教科ですか?いいえ、主題があり、ラボがあるので、「has-a」の関係です。したがって、この場合はポインタを使用する必要があります。

教師の研究室を変更しようとすると、継承が機能しない理由が明らかになります。ポインタが指しているオブジェクトは簡単に変更できますが、基本クラスのすべてのデータを置き換えるのははるかに面倒です。

継承を使用する例を示すと、EnglishTeacherはTeacherでもあるため、Teacherを継承できますが、追加の機能があります。

于 2012-08-14T15:44:04.180 に答える
1

常識的なアプローチを取る:

継承はis-a関係を表します。先生は明らかにaSubjectでもaでもありません、Labそしてこれは深刻な眉毛を上げる人になるでしょう。has-aですから、集約(aまたはhas-many)が進むべき道だと思います。

また、値セマンティクスと参照セマンティクスのどちらを使用しているかを判断する必要があります。つまり、平等はプログラム内のオブジェクトの実際の平等であるか、オブジェクトの特定の部分を通じて計算可能であるということです。

参照セマンティクスを使用する場合は、スマートポインターまたはその他の形式のメモリ管理を使用していることを確認する必要があります。そうしないと、物事がすぐに醜くなります。

于 2012-08-14T15:42:06.547 に答える
1

最後の例のようにクラスを継承するときは、そのクラスの既存の定義済みの動作を拡張するものと考えてください。その意味で、「教師」は「ラボ」の機能を強化するのでしょうか。私にとって、答えは明らかです-それらはそうではありません-それらは完全に異なるオブジェクトであるため、継承は問題のドメインでこれらの要素をモデル化する理想的な方法ではありません。教師にはクラスがあり、クラスは主題があります。したがって、集約は従うべきより良い方法のようです。

于 2012-08-14T15:45:57.907 に答える
0

この例を見ると、概念が理解できます。

void doExperimentsIn( Lab &room ){...}

から派生Teacherした場合Labは、内でも実験を行うことができTeacherます。(これはばかげています。)

于 2012-08-14T15:59:28.433 に答える