2017-03-31 44 views
3

我是OO设计的新手,我想知道是否有设计让对象包含其他对象列表的典型设计。一个例子如下:在对象中有对象列表是否正常?

// Person object containing a list of phone numbers 
public class Person 
{ 
    public Guid Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Phone> Contacts { get; set; } 

    public void AddPhoneNumber(Phone phone) 
    { 
     Contacts.Add(phoneNumber); 
    } 
} 

// Phone object 
public class Phone 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Number { get; set; } 
} 

// Example code to establish an object: 
Person p1 = new Person(); 
p1.FirstName = "John"; 
p1.LastName = "Smith"; 
p1.AddPhoneNumber(new Phone() { Number = "555957000" }); 
p1.AddPhoneNumber(new Phone() { Number = "555579561" }); 

有没有更好的方法来构建这个简化设计并允许更容易访问数据?谢谢!

+0

看起来你的结构在类中看起来很好。你可以发布你如何访问数据进行存储/检索吗?可以帮助您改善代码的这一方面。 – TheFallenOne

回答

6

是的,这绝对是罚款,有一个对象包含对象的列表。在OOPs这就是所谓的组成,这代表参加01​​之间牢固的合作关系。

+0

感谢您的任期,我​​会做额外的研究。 – EnterTheCode

+0

我喜欢你的精神:)有两个术语**组成**和**协会**请阅读两个术语。您能否将其标记为已接受的答案? – Geek

0

你的代码没有问题。在对象中有一个对象列表是完全有效的。

虽然添加一个字符串,您的电话对象列表将抛出一个错误。

您可以添加电话号码,像这样:

Person p1 = new Person(); 
p1.Contacts.Add(new Phone() { Number = "555579561" }); 
+0

好的,我会更新代码! – EnterTheCode

0

你在做什么是好的,只要用数据去工作,但是当谈到时间来存储或检索联系人的列表一个给定的对象,你可能会遇到麻烦。

根据我的理解,您需要每次将列表序列化并反序列化以存储到数据库字段中,或者创建一个PersonContacts表,其中每个联系人都有两个字段personID和contactID。

有人请纠正我,如果有这个更好的解决方案。

+0

迄今为止发现的最大问题是:显示电话数据并允许用户编辑的能力。接下来,要更新数据库,您需要再次从数据库中检索Person数据,根据Guid找到匹配的Person,根据Guid找到匹配的Phone,然后更新Phone数据。看起来过于复杂。 – EnterTheCode

+0

这就是我所得到的。存储和检索对象列表的过程在我的解决方案中过于繁琐,我希望有人能以更好的方式进行嵌入。我感到你的痛苦,我很高兴你发布了这个问题。我已经搜索答案之前没有运气 –

+0

我完全同意。我希望有人有一些额外的知识或他们可以分享的例子。 – EnterTheCode

1

我想知道是否有典型的设计,其中对象 包含其他对象的列表。

当然,这是正常的,因为一个对象可以包含仅属于该特定对象的列表。其中一个例子是当你遍历二叉树时,或者你可以让每个节点都有自己的列表来标识他们的孩子。还有很多情况下对象应该可以包含他们自己的列表。

回到您的代码,您似乎有一个错误,因为下面的代码声明该列表将包含Phone对象。

public List<Phone> Contacts { get; set; } 

但是你传递的是字符串对象而不是电话对象。

public void AddPhoneNumber(string phoneNumber) 
{ 
    Contacts.Add(phoneNumber); // this code shouldnt compile 
} 

,而你可以做的是这样的:

public void AddPhoneNumber(string phoneNumber) 
{ 
    Contacts.Add(new Phone() { Number = phoneNumber }); 
} 
+0

你说得对,那绝对是一个错误。我将方法参数修改为Phone对象。 – EnterTheCode

相关问题