2017-01-09 3 views
0

(MATLAB内)A & Bです。クラスA & Bから作成されたオブジェクトを両方のプロパティとして割り当てたいA & B私のコードは、このプロパティとして他のクラスを含むクラス

classdef A < handle 

    properties 
     container 
    end 

    methods 
     function object = A() 
     end 
    end 
end 

のように見え、この

classdef B < handle 

    properties 
     container 
    end 

    methods 
     function object = B() 
     end 
    end 
end 

は、その後、私は

object_from_class_A.container = object_from_class_A 
のように、 A & B両方のクラス A & Bから container -propertyへのクラスから両方のオブジェクトを割り当てています

および

object_from_class_A.container = object_from_class_B 

これは、異なるクラスのオブジェクトを格納するために同じ変数/プロパティを使用することを意味します。これは悪いデザインの選択ですか?これを避けるにはどうすればいいですか?私は、異なるオブジェクト間の関係を構築しようとしているので、オブジェクトをお互いに割り当てようとしています。

P.S.私はOOPを初めて利用しています。より良い説明のための

編集:

クラスA & Bは根本的に異なっていて、お互いから継承/接続しないでください。オブジェクトcityにはオブジェクトstreetとオブジェクトhouseが含まれ、オブジェクトhouseにはオブジェクトstreetが接続されています。したがって、streethousecityから継承する必要がありますが、streethouseは互いに知っている必要があります。しかし、私はcityからすべて継承するが、お互いの間で他のものを共有/継承しない多くのオブジェクト(標識、車、人、猫、犬など)の関係をどのように認識するべきですか?

は、例えば、私はcarstreetオブジェクトbeween接続を確立したいので、私は特定のstreet -objectに見れば、私はstreetオブジェクトに特定のオブジェクトcar1car2car3を割り当てます。

+0

両方のクラスのオブジェクトを同じ変数に割り当てる場合は、2つのクラスの違いは何ですか? 2つのクラスはスーパークラスに関連していますか(または関連づけられていますか?)、または基本的に異なる2つのクラスですが、情報を共有する必要がありますか?それは最高のデザインではありませんが、クラスそのものに関する詳しい情報が必要だと思います。 – beaker

+0

クラスAとBは根本的に異なっています(私はもっと具体的にすべきです...)。 – Lemonbonbon

+3

"street"と "house"は 'city'から継承する必要があります。同意しません。これらの3つの項目は基本的に異なるエンティティですが、関連しています。私はそれらに独自のクラスを作って、 'city'にOOPの用語で' 'street''配列と' 'house''配列を含めるように言います。 – TroyHaskin

答えて

2

質問に基づいて、本質的にオブジェクト間の一対多の関係をエミュレートする必要があります。

これを行う可能な方法の1つは、「多くの」側のオブジェクトの中の関係の「一方」側にハンドルを格納してから、findobjのようなものを使用して、同じ「1つの」オブジェクト参照。

CarStreetの例です。

classdef Car < handle 
    properties 
     name 
     street  % A handle to the street you're on 
    end 

    methods 
     function self = Car(name, street) 
      self.name = name; 
      self.street = street; 
     end 
    end 
end 

そしてあなたStreetクラス

classdef Street < handle 
    properties 
     name 
    end 

    methods 
     function self = Street(name) 
      self.name = name; 
     end 
    end 
end 

そして、あなたは

% Create some streets 
streets = [Street('Street1'), ... 
      Street('Street2')]; 

% Create some cars 
cars = [Car('one', streets(1)), ... 
     Car('two', streets(2)), ... 
     Car('three', streets(1))]; 

% Now get cars that are on Street1 
cars_on_street_1 = findobj(cars, 'street', streets(1)); 

これは、あなたので、街を(変更するには些細であるという追加の利点を持っているようにそれを使用することができますのみ車オブジェクトを更新する必要があります)

cars(1).street = streets(2); 

StreetCarのオブジェクトのリストをfindobjに渡す必要があり、この検索が非常に多数のオブジェクトのパフォーマンスのボトルネックになる可能性があるという点が欠点です。

車がどこにあるかなどを変更しない場合は、クラス関係を構築するファクトリを作成することができます(両方のオブジェクトに参照を追加する)。あなたは作成しました。

1

あなたの質問を正しく理解している場合は、ここに私の提案があります。

継承は、新しいクラスが別のクラスのプロパティとメソッドを引き継ぐことを可能にします。あなたのケースのクラスBは、クラスAから継承している場合は、追加の関数定義を必要としません。

+0

しかし、クラスAとBは異なるので、接続しないでください。私はこのようなことを覚えています:オブジェクト '都市'はオブジェクト '街路'とオブジェクト '家'を含み、オブジェクト '家'はオブジェクト '街路'に接続します。だから、「通り」と「家」は「都市」から継承するべきだが、「通り」と「家」は互いに知っているはずである。しかし、「都市」を継承する多くのオブジェクトの関係をどうすればわかるのですか? – Lemonbonbon

+0

これは本当にコメントであり、答えではありません。もう少し担当者がいれば、[コメントを投稿できる](// stackoverflow.com/privileges/comment)。あなたが評判が50になったら、解答を精緻化するか、それを完全に削除して、コメントとして再投稿してください。 – Adriaan

関連する問題