0
votes

in MATLAB I have different classes A & B. I want to assign objects created from class A & B as properties in both A & B . My code looks like this

classdef A < handle

   properties
      container
   end

   methods
      function object = A()
      end
   end
end

and this

classdef B < handle

   properties
      container
   end

   methods
      function object = B()
      end
   end
end

Then I am assigning both objects from class A & B to the container-property from both classes A & B, like

object_from_class_A.container = object_from_class_A

and

object_from_class_A.container = object_from_class_B

This means, I use the same variable/property for storing objects from different classes. Is this a bad design choise? How should I avoid this? I am just trying to assign objects to each other, because I am trying to build relationships between different objects.

P.S. I am new to OOP.

Edit for better explanation:

Class A & B are fundamentally different and should not be connected/inherited from each other. I have something in mind like this: Object city contains object street and object house, object house is connected to object street. So, street and house should inherit from city, but street and house should know each other. But how should I realize the relation between many objects (like sign, car, people, cat, dog, etc) that all inherit from city but dont share/inherit anything else between each other?

For example I want to establish a connection beween a car an an street object, so if I look into a specific street-object, I want to assign the specific objects car1, car2, car3 to the street object.

2
If you're assigning objects from both classes to the same variable, what is the difference between the two classes? Are the two classes related (or relatable) by a superclass, or are the two classes fundamentally different but need to share information? As it stands this is not the best design, but I think we need further information about the classes themselves to help. - beaker
The classes A & B are fundamentally different (yes I should be more specific...). - Lemonbonbon
"street and house should inherit from city". I disagree. Those three items are fundamentally different entities, albeit related. I would say make them their own classes, and have city contain, or in OOP terminology "be composed of", street arrays and house arrays. - TroyHaskin
See is-a vs. Has-a. - beaker
AH, this is usefull. Thanks! I think I am looking for a "aggregation-relation" (relation without ownership). Do you have an example how to implement this in MATLAB? - Lemonbonbon

2 Answers

2
votes

Based on your question, you essentially want to emulate a one-to-many relationship between objects.

One possible way of doing this would be to store the handle to the "one" side of the relationship within each of the "many" side's objects and then use something like findobj to get the a list of objects that share the same "one" object reference.

In the case of your Car and Street example.

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

And then your Street class

classdef Street < handle
    properties
        name
    end

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

And then you could use it like

% 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));

This has the added advantage in that it is trivial to change streets (since you only have to update the car object)

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

The downside is that you have to maintain a list of Street and Car objects to pass to findobj and this search could potentially get to be a performance bottleneck for a very large number of objects.

Now if you're not going to be changing what street a car is on etc. then you could always create a factory to construct the class relationships (adding references in both objects) and then just use the data that you've created.

1
votes

If I am understanding your question correctly here is my suggestion.

Inheritance enable a new class to take on properties and methods of another class. Class B in your case wouldn't need the additional function definition if you have it inherit from class A.