在 C# 中使 class 的一个实例包含另一个 class 的实例集合
Make one instance of a class hold a collection of instances of another class in C#
C# 和 OOP 编程的新手。我了解继承部分等等。
我坚持的(对于一个小型学校项目)如下:
- 我有一个 Class 团队
- 我有一个名为 TeamMember
的基地class
- 我有 3 个 classes(更具体的团队角色)继承自 TeamMember
- 每个团队只能有一定数量的团队成员(即每个团队 10 名团队成员)
团队不继承任何其他 class,但(在现实世界中)一个团队确实有团队成员(否则当然没有团队)。
在 Team 和 TeamMember(或更具体的角色)之间建立连接以使 1 个 Team 实例具有 10 个 TeamMember 实例的正确方法是什么 'in it'?
能不能通过数组来实现?如果是这样,我在什么地方 Class 初始化这个数组以及如何用正确的对象填充它?
(如果我的术语没有达到应有的水平,请原谅。仍在学习,如果我可以在某个地方改进它,请纠正我,我会编辑它)
一个很好的方法是做这样的事情:
public class Team
{
private List<TeamMember> _teamMembers;
public Team()
{
this._teamMembers = new List<TeamMember>();
}
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
if (this._teamMembers.Count < 10)
this._teamMembers.Add(newTeamMember);
}
}
那么,我们这里有什么?
我引入了一种控制团队成员的简单方法,而不是使用设置长度的数组然后依赖异常。
class 属性 是私有的,因此您不能直接向其中添加任何内容。
相反,我创建了一个 public 方法,它公开了一种将成员添加到所述列表的方法,这是我们控制可以添加多少团队成员的地方。
我喜欢在构造函数中实例化列表属性,因此当您使用 class 时,您无需检查该列表是否存在,而是将其初始化为一个空列表,如下所示一旦创建了 Team 实例,就不用再担心了。
然后我们可以做出更多的设计决策,也许我们希望该方法 return 一个布尔结果,如果有人被添加则为 true,如果没有添加则为 false,因为我们已经有 10 个。
现在,您说 TeamMember 是其他 class 的基础 class。这意味着您可以将所有这些 class 传递给您的团队。
假设您有这样的事情:
public class SomeMember : TeamMember
{
}
您仍然可以像这样将其添加到您的列表中:
var team = new Team();
var someMember = new SomeMember();
team.AddTeamMember(someMember);
该代码之所以有效,是因为它基于基础 class,并且这是一种常用的处理方式。如果你有一个接口,它也可以工作。
但是,要记住的一件事是,如果您这样做,那么您将无法获得其他 classes 提供的任何额外东西,除非您将它们从基地中放回class 到实施者。
我对 OOP 不是很陌生,但我不是一个非常聪明的开发人员。
这很有趣,它是关于你如何设计 TeamMember 的 children.
的 3 classes
我建议你将每个类型的TeamMembers封装在class的Team中
试着想象在你的团队中你会有很多人,在那之后
这是关于如何设计团队中 ppl 的层次结构。
在我的例子中,我将成员分成 TeamMember 的 children 的 3 个列表。每个 class 都有特殊的 属性 即 prop1、prop2、prop3(当你考虑 OOP 时,你将不得不考虑重用什么,不同的 fields/methods 提供了什么每个成员不同 class ).
例如
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("Hello, world!");
Team t =new Team();
t.AddTeamMember( new TeamMembers_Child1(){ name ="n1" ,prop1 ="I'm a staff" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n2" ,prop2 ="I'm a manager" } );
t.AddTeamMember( new TeamMembers_Child3(){ name ="n3" ,prop3 ="I'm a janitor" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n4" ,prop2 ="I'm an imposter " } );
}
}
public class TeamMember{
public string name {get;set;}
}
public class TeamMembers_Child1 : TeamMember{
public string prop1 {get;set;}
}
public class TeamMembers_Child2 : TeamMember{
public string prop2 {get;set;}
}
public class TeamMembers_Child3 : TeamMember{
public string prop3 {get;set;}
}
public class Team{
private List<TeamMembers_Child1> _member_role1;
private List<TeamMembers_Child2> _member_role2;
private List<TeamMembers_Child3> _member_role3;
public Team(){
_member_role1 = new List<TeamMembers_Child1>();
_member_role2 = new List<TeamMembers_Child2>();
_member_role3 = new List<TeamMembers_Child3>();
}
/* as Andrei Dragotoniu 's answer the logic of Adding member will be in this function like team only have 2 manager , etc.*/
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
else if (this._member_role1.Count + this._member_role2.Count + this._member_role3.Count < 10){
if( newTeamMember is TeamMembers_Child1)
{
this._member_role1.Add( ( TeamMembers_Child1 )newTeamMember);
Console.WriteLine("Add role1");
}else if( newTeamMember is TeamMembers_Child2)
{
this._member_role2.Add(( TeamMembers_Child2 )newTeamMember);
Console.WriteLine("Add role2");
} else if( newTeamMember is TeamMembers_Child3)
{
this._member_role3.Add(( TeamMembers_Child3 )newTeamMember);
Console.WriteLine("Add role3");
}
}
}
}
}
result
> Hello, world!
> Add role1
> Add role2
> Add role3
> Add role2
C# 和 OOP 编程的新手。我了解继承部分等等。
我坚持的(对于一个小型学校项目)如下:
- 我有一个 Class 团队
- 我有一个名为 TeamMember 的基地class
- 我有 3 个 classes(更具体的团队角色)继承自 TeamMember
- 每个团队只能有一定数量的团队成员(即每个团队 10 名团队成员)
团队不继承任何其他 class,但(在现实世界中)一个团队确实有团队成员(否则当然没有团队)。
在 Team 和 TeamMember(或更具体的角色)之间建立连接以使 1 个 Team 实例具有 10 个 TeamMember 实例的正确方法是什么 'in it'?
能不能通过数组来实现?如果是这样,我在什么地方 Class 初始化这个数组以及如何用正确的对象填充它?
(如果我的术语没有达到应有的水平,请原谅。仍在学习,如果我可以在某个地方改进它,请纠正我,我会编辑它)
一个很好的方法是做这样的事情:
public class Team
{
private List<TeamMember> _teamMembers;
public Team()
{
this._teamMembers = new List<TeamMember>();
}
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
if (this._teamMembers.Count < 10)
this._teamMembers.Add(newTeamMember);
}
}
那么,我们这里有什么?
我引入了一种控制团队成员的简单方法,而不是使用设置长度的数组然后依赖异常。
class 属性 是私有的,因此您不能直接向其中添加任何内容。
相反,我创建了一个 public 方法,它公开了一种将成员添加到所述列表的方法,这是我们控制可以添加多少团队成员的地方。
我喜欢在构造函数中实例化列表属性,因此当您使用 class 时,您无需检查该列表是否存在,而是将其初始化为一个空列表,如下所示一旦创建了 Team 实例,就不用再担心了。
然后我们可以做出更多的设计决策,也许我们希望该方法 return 一个布尔结果,如果有人被添加则为 true,如果没有添加则为 false,因为我们已经有 10 个。
现在,您说 TeamMember 是其他 class 的基础 class。这意味着您可以将所有这些 class 传递给您的团队。
假设您有这样的事情:
public class SomeMember : TeamMember
{
}
您仍然可以像这样将其添加到您的列表中:
var team = new Team();
var someMember = new SomeMember();
team.AddTeamMember(someMember);
该代码之所以有效,是因为它基于基础 class,并且这是一种常用的处理方式。如果你有一个接口,它也可以工作。
但是,要记住的一件事是,如果您这样做,那么您将无法获得其他 classes 提供的任何额外东西,除非您将它们从基地中放回class 到实施者。
我对 OOP 不是很陌生,但我不是一个非常聪明的开发人员。 这很有趣,它是关于你如何设计 TeamMember 的 children.
的 3 classes我建议你将每个类型的TeamMembers封装在class的Team中 试着想象在你的团队中你会有很多人,在那之后 这是关于如何设计团队中 ppl 的层次结构。 在我的例子中,我将成员分成 TeamMember 的 children 的 3 个列表。每个 class 都有特殊的 属性 即 prop1、prop2、prop3(当你考虑 OOP 时,你将不得不考虑重用什么,不同的 fields/methods 提供了什么每个成员不同 class ).
例如
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("Hello, world!");
Team t =new Team();
t.AddTeamMember( new TeamMembers_Child1(){ name ="n1" ,prop1 ="I'm a staff" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n2" ,prop2 ="I'm a manager" } );
t.AddTeamMember( new TeamMembers_Child3(){ name ="n3" ,prop3 ="I'm a janitor" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n4" ,prop2 ="I'm an imposter " } );
}
}
public class TeamMember{
public string name {get;set;}
}
public class TeamMembers_Child1 : TeamMember{
public string prop1 {get;set;}
}
public class TeamMembers_Child2 : TeamMember{
public string prop2 {get;set;}
}
public class TeamMembers_Child3 : TeamMember{
public string prop3 {get;set;}
}
public class Team{
private List<TeamMembers_Child1> _member_role1;
private List<TeamMembers_Child2> _member_role2;
private List<TeamMembers_Child3> _member_role3;
public Team(){
_member_role1 = new List<TeamMembers_Child1>();
_member_role2 = new List<TeamMembers_Child2>();
_member_role3 = new List<TeamMembers_Child3>();
}
/* as Andrei Dragotoniu 's answer the logic of Adding member will be in this function like team only have 2 manager , etc.*/
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
else if (this._member_role1.Count + this._member_role2.Count + this._member_role3.Count < 10){
if( newTeamMember is TeamMembers_Child1)
{
this._member_role1.Add( ( TeamMembers_Child1 )newTeamMember);
Console.WriteLine("Add role1");
}else if( newTeamMember is TeamMembers_Child2)
{
this._member_role2.Add(( TeamMembers_Child2 )newTeamMember);
Console.WriteLine("Add role2");
} else if( newTeamMember is TeamMembers_Child3)
{
this._member_role3.Add(( TeamMembers_Child3 )newTeamMember);
Console.WriteLine("Add role3");
}
}
}
}
}
result
> Hello, world!
> Add role1
> Add role2
> Add role3
> Add role2