2017-01-09 3 views
0

in 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 

Тогда я задаю как объекты класса A & B к container -свойстве из обоих классов A & B, как

object_from_class_A.container = object_from_class_A 

и

object_from_class_A.container = object_from_class_B 

Это означает, что я использую ту же переменную/свойство для хранения объектов из разных классов. Это плохой дизайн? Как мне избежать этого? Я просто пытаюсь назначить объекты друг другу, потому что я пытаюсь построить отношения между разными объектами.

P.S. Я новичок в ООП.

Edit для лучшего объяснения:

Класс A & B принципиально различны и не должны быть подключены/унаследованы друг от друга. У меня есть что-то в виду вот так: Объект city содержит объект street и объект house, объект house связан с объектом street. Таким образом, street и house должны наследовать от city, но street и house должны знать друг друга. Но как я должен понимать связь между многими объектами (например, знаком, автомобилем, людьми, кошкой, собакой и т. Д.), Которые все наследуют от city, но не разделяют/не наследуют что-либо еще между собой?

Например, я хочу, чтобы установить соединение beween в car УДЕ street объекта, так что если я смотрю в определенный street -объекта, я хочу, чтобы назначить определенные объекты car1, car2, car3 к street объекту.

+0

Если вы назначаете объекты из обоих классов в одну и ту же переменную, какова разница между этими двумя классами? Являются ли эти два класса связанными (или взаимодополняемыми) с суперклассом, или два класса принципиально отличаются друг от друга, но им необходимо обмениваться информацией? Поскольку это стоит, это не лучший дизайн, но я думаю, нам нужна дополнительная информация о самих классах, чтобы помочь. – beaker

+0

Классы A & B принципиально разные (да, я должен быть более конкретным ...). – Lemonbonbon

+3

«' '' '' '' '' 'должен унаследовать от' city'. Я не согласен. Эти три элемента являются принципиально разными субъектами, хотя и связаны друг с другом. Я бы сказал, сделайте их собственными классами, и «город» содержит, или в терминологии ООП », состоящий из массивов« '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. – TroyHaskin

ответ

2

Основываясь на вашем вопросе, вы по сути хотите подражать отношениям «один ко многим» между объектами.

Один из возможных способов сделать это - сохранить дескриптор «одной» стороны отношений внутри каждого из объектов «много», а затем использовать что-то вроде findobj, чтобы получить список объектов, которые совместно используют такой же «одной» ссылкой на объект.

В случае ваших Car и Street примеров.

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

Недостатком является то, что вам необходимо вести список и Car объектов для перехода на findobj, и этот поиск потенциально может стать узким местом производительности для очень большого количества объектов.

Теперь, если вы не собираетесь менять какую улицу автомобиль включен и т. Д., Вы всегда можете создать фабрику для создания отношений класса (добавление ссылок в оба объекта), а затем только используйте данные, которые вы создали.

1

Если я правильно понимаю ваш вопрос, здесь мое предложение.

Inheritance позволяет новому классу использовать свойства и методы другого класса. Класс B в вашем случае не нуждается в дополнительном определении функции, если у вас есть наследование от класса A.

+0

Но класс A & B отличается и не должен быть подключен. У меня есть что-то в виду: Object 'city' содержит объект' street' и объект 'house', объект' house' связан с объектом 'street'. Итак, «улица» и «дом» должны наследовать «город», но «улица» и «дом» должны знать друг друга. Но как я должен осознавать связь между многими объектами, которые все наследуют от «города»? – Lemonbonbon

+0

Это действительно комментарий, а не ответ. С немного больше rep, [вы сможете оставлять комментарии] (// stackoverflow.com/privileges/comment). Пожалуйста, либо уточните ответ, либо удалите его вообще, возможно, переставив его в качестве комментария, как только у вас будет 50 репутации. – Adriaan

Смежные вопросы