2012-01-19 20 views
0
class CommandSchedule 
    { 
    private : 
     List<SubSchedule*> mSubScheduleList; 
    public : 
     void addSubSchedule (int id) 
     { 
      mSubScheduleList.add(new SubSchedule(id)); 
     } 
     SubSchedule* addSubSchedule (int id) 
     { 
      SubSchedule* item = new SubSchedule(id); 

      mSubScheduleList.add(item); 

      return item; 
     } 
    }; 

このクラスでは、voidを返す1つのaddSubSchedule関数と、オブジェクトへのポインタを返す関数を定義します。カプセル化とオブジェクトへのポインタ

私の質問は、オブジェクトへのポインタを返す関数がCommandScheduleクラスのカプセル化を解除する場合です。私はカプセル化の問題に不快感を感じるので、どんな助けでも大いに感謝しています。

+3

本当に両方の方法が必要ですか?冗長に見えるので、 'void'バージョンを削除することを検討したいかもしれません。 –

答えて

3

なぜカプセル化が中断しますか?あなたのオブジェクトの内部表現がまだ隠されている:

private : 
    List<SubSchedule*> mSubScheduleList; 

SubScheduleない限りここにも全く問題はありません、内部表現と考えられています。

よくカプセル化されたクラスでは、そのメンバ関数だけが内部の詳細を操作できます。この場合、Listが使用されているという事実は詳細であるように見えます。なぜなら、パブリックインターフェイスのユーザが気にするのは、そのクラスがサブスケジュールを追加できるからです。それらのサブスケジュールがどのように格納されるかは、内部的な詳細です。パブリックインターフェイスのユーザに影響を与えずに、後でこの詳細を変更することができます(たとえば、SortedListに保存するなど)。したがって、List<...>変数をプライベートにすると、良好なカプセル化が促進されます。

インターフェイスのユーザがSubScheduleオブジェクトを直接操作できると想定している場合、それを公開する際に問題はありません。しかし、それを行う理由がなければ、SubScheduleの使用はおそらく内部の詳細でもあり、公共のインターフェースで公開されるべきではない。

+0

これをうまく答えるには、*内部表現*が何であるかについての簡単な説明を追加してください。OPがそれについて混乱しているようです。 –

関連する問題