2017-01-09 83 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 

然后我从分配级两个对象A & B从两个班A & Bcontainer - 属性,像

object_from_class_A.container = object_from_class_A 

and

object_from_class_A.container = object_from_class_B 

这意味着,我使用相同的变量/属性来存储来自不同类的对象。这是一个糟糕的设计选择?我应该如何避免这种情况?我只是试图将对象分配给对方,因为我试图在不同的对象之间建立关系。

P.S.我是OOP的新手。

编辑为更好的解释:

A & B是根本不同的,并且不应被连接/从彼此继承。我有这样的想法:对象city包含对象street和对象house,对象house连接到对象street。所以,streethouse应该继承city,但是streethouse应该互相认识。但是,我应该如何认识到所有从city继承的许多对象(如标志,汽车,人,猫,狗等)之间的关系,但不要在彼此之间共享/继承任何其他东西?

例如,我要建立一个beween的carstreet对象的连接,所以如果我寻找到一个特定的street -object,我想向特定对象car1car2car3分配给street对象。

+0

如果您将两个类的对象分配给相同的变量,那么这两个类之间有什么区别?这两个类是超类的关系(或可关联的),还是两个类根本不同,但需要共享信息?按照现状,这不是最好的设计,但我认为我们需要关于这些类的更多信息来帮助他们。 – beaker

+0

A和B类从根本上不同(是的,我应该更具体...)。 – Lemonbonbon

+3

“'street”和'house'应该从'city'继承。我不同意。这三个项目是根本不同的实体,尽管有关。我会说让他们成为他们自己的班级,并且拥有“城市”,或者在OOP术语中“由......组成”,“街道”阵列和“家庭”阵列。 – TroyHaskin

回答

2

根据您的问题,您基本上想要模拟对象之间的一对多关系。

这样做的一种可能的方法是将句柄存储到每个“许多”一侧的对象内的“一方”关系中,然后使用类似findobj的东西来获取共享对象的列表相同的“一个”对象引用。

例如您的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类不同,不应连接。我有这样的想法:对象'city'包含对象'street'和对象'house',对象'house'连接到对象'street'。所以,“街道”和“房子”应该从“城市”继承,但“街道”和“房子”应该相互了解。但是我应该如何认识所有从“城市”继承的对象之间的关系? – Lemonbonbon

+0

这真的是一个评论,而不是一个答案。有了更多的代表,[你将能够发表评论](// stackoverflow.com/privileges/comment)。请详细说明答案,或者将其完全删除,一旦有50点声望,可以将其重新发布为评论。 – Adriaan