2012-01-20 10 views
1

これはOOP質問の一種です。答えはC++、C#、ObjCのいずれの場合でもうまくいきます。 アプリケーションでは、私は次のクラス構造を持っています。データの複製なしでサブクラス/スーパークラスにキャスト/インスタンス化/変換する

class ToSend { 
    public int id; 
    public int prop1; 
} 

class Received : ToSend { 
    public int prop2; 
    public int prop3; 
} 

class Viewer : Received { 
    public static int viewerProp; 
    public String viewerMethod() {... Using viewerProp...} 
} 

クラスのコレクション受信したサービスから受け取りました。コレクションの各アイテムをリストに表示するには、viewerMethod(Viewer)を使用する必要があります。複数の選択とprop1の変更の後、変更のコレクション(ToSend)を送り返す必要があります。

質問1:どのようにviewerMethodを使用するためにReceived to Viewerのすべてのインスタンスをキャストまたは変換できますか? ファサードパターンを使用する必要がありますか?あまりにも多くのスペースを取るので、私はデータをコピーしたくないです。

質問2:アクセシブルプロパティを制限するために、ReceivedからToSendの選択されたインスタンスをキャストまたは変換するにはどうすればよいですか? (明示的キャスト後JSonエンコーダは、送信メッセージのReceivedのすべてのプロパティを含む)

答えて

1

継承ではなく視聴者に構図を使用したいと思うかもしれません。結局のところ、はビューアを受信を受信して​​いない、受信したデータを表示するには、ビューアを使用します。

class Viewer 
{ 
    public Viewer(Received received) 
    { 
     this.received = received; 
    } 

    private Received received; 

    public string ViewerMethod() { ... } 
} 
3

最初に、継承が正しい解決策であるかどうかを尋ねます。一般的な経験則は、2つのクラス間の関係を言葉で表現することです。

ClassAがClassBであると言う場合、ほとんどの場合、継承を使用する必要があります。例えば、タイガーは動物である哺乳動物です。虎は、すべての動物に共通するすべての特性と、すべての哺乳動物に共通の特性と、それ自身の種に固有の特性とを継承します。

ClassA HASクラスBと言う場合は、ほとんどの場合、構図を使用する必要があります。たとえば、タイガーHAS歯と爪。しかし、歯が虎であるとは決して言わないので、Toothクラスは決して虎クラスから継承してはいけません。その代わりに、Tigerクラスのメンバ変数でなければなりません。

ビューアがReceivedの特別なケースでない場合、Receivedから継承してはなりません。

関連する問題