C# 在一个对象中有一个对象列表是正常的吗?

C# 在一个对象中有一个对象列表是正常的吗?,c#,oop,C#,Oop,我是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<

我是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" });
//包含电话号码列表的Person对象
公共阶层人士
{
公共Guid Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共列表联系人{get;set;}
公用void AddPhoneNumber(电话号码)
{
联系人。添加(电话号码);
}
}
//电话对象
公用电话
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共字符串编号{get;set;}
}
//建立对象的示例代码:
人员p1=新人员();
p1.FirstName=“约翰”;
p1.LastName=“史密斯”;
p1.AddPhoneNumber(新电话(){Number=“555957000”});
p1.AddPhoneNumber(新电话(){Number=“555579561”});

是否有更好的方法来构建此结构,从而简化设计并允许更容易地访问数据?谢谢

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

尽管在电话对象列表中添加字符串会引发错误

您可以添加一个电话号码,如下所示:

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

就处理数据而言,您所做的一切都很好,但是当需要存储或检索给定对象的联系人列表时,您可能会遇到麻烦

据我所知,您要么每次都需要序列化和反序列化列表以存储到数据库字段中,要么创建一个PersonContacts表,其中有两个字段,每个联系人的personID和contactID

如果有更好的解决办法,请有人纠正我

我想知道,在物体的位置设计是否是典型的 包含其他对象的列表

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

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

public List<Phone> Contacts { get; set; }
相反,你能做的是:

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

是的,让一个对象包含对象列表是绝对正确的。在
OOPs
中,这被称为Composition,表示参与的
类之间的紧密关系

你说得对,那肯定是个错误。我将方法参数改为电话对象。到目前为止,我发现的最大问题是:显示电话数据和允许用户编辑的能力。接下来,要更新数据库,需要再次从数据库中检索人员数据,根据Guid查找匹配的人员,根据Guid查找匹配的电话,然后更新电话数据。看起来太复杂了,这就是我的意思。在我的解决方案中,存储和检索对象列表的过程过于繁琐,我希望有人能提供更好的方法。我感觉到你的痛苦,我很高兴你把这个问题贴出来。我以前在谷歌上搜索过答案,没有一个luckI完全同意。我希望有人有一些额外的知识或例子,他们可以分享。感谢这个学期,我会做额外的研究。我喜欢你的精神:)有两个学期组成和协会请阅读这两个学期。你能把它标记为接受答案吗?看起来你的课程结构看起来不错。您是否可以发布您如何访问数据以进行存储/检索?可能会帮助您改进代码的这一方面。
public void AddPhoneNumber(string phoneNumber)  
{
    Contacts.Add(new Phone() { Number = phoneNumber });
}