C# 类设计和对象引用
这是一个非常基本的例子,我正在尝试做什么。在现实中,有更多的关系,但不是一些极端或记忆沉重的东西C# 类设计和对象引用,c#,design-patterns,architecture,C#,Design Patterns,Architecture,这是一个非常基本的例子,我正在尝试做什么。在现实中,有更多的关系,但不是一些极端或记忆沉重的东西 public class ClassA : ISomething { public double property { get; set; } ... public ClassB classb { get; set; } } public class ClassB : ISomething2 { public double Length { get; set; }
public class ClassA : ISomething
{
public double property { get; set; }
...
public ClassB classb { get; set; }
}
public class ClassB : ISomething2
{
public double Length { get; set; }
...
}
public class MyProject : BaseProject
{
public IEnumerable<ISomething> ISomethings { get; set; }
...
public IEnumerable<ISomething2> ISomethings2 { get; set; }
...
}
公共类ClassA:ISomething
{
公共双属性{get;set;}
...
公共类B类B{get;set;}
}
公共类B类:等距2
{
公共双长度{get;set;}
...
}
公共类MyProject:BaseProject
{
公共IEnumerable等距对象{get;set;}
...
公共IEnumerable等轴测2{get;set;}
...
}
这里的问题是,我必须保留ClassA的ISomethings2
列表,然后classb
属性,以仅引用ISomething2
列表中的现有项。这里最困难的是:
- 从
中删除项应删除对该项的所有引用(ISomething2
将ClassA实例的属性设置为null)classb
- 防止其他开发人员将
属性设置为列表中不存在的对象或新的用户创建的对象classb
中的对象可以不被引用而存在ISomethings2
有没有一种模式可以在没有太多耦合的情况下实现我想要的?也欢迎其他设计/方法。Hmmm,我个人会用字符串ClassBId替换ClassA中的ClassB对象,只需要一个列表 但是!如果要保留该结构,可以使项目ISomething2可枚举链接到Isomething1可枚举。即
public class MyProject
{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 {
get { return this.ISomethings.Select(i => i.classB); }
}
public void RemoveSomething(ISomething2 s)
{
foreach (var somthing in this.ISomethings.Where(i => i.classB == s))
{
somthing.classB = null;
}
}
}
公共类MyProject
{
公共IEnumerable等距对象{get;set;}
公共IEnumerable等距2{
获取{返回this.ISomethings.Select(i=>i.classB);}
}
公共空间移除某物(等距2 s)
{
foreach(这个.ISomethings.Where中的var somthing(i=>i.classB==s))
{
somthing.classB=null;
}
}
}
您需要一个管理器
类,并在类中添加一些行为
首先是ManagerClass
public class ManagerClass{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 { get; set; }
public void RemoveSomething2(ISomething2 something2){
//iterate through ISomething and remove the ClassB reference
}
}
虽然我更喜欢带有关系模型的简化版本
public class SomethingRelation{
public ISomething something;
public ISomething2 something2;
}
public class ManagerClass{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 { get; set; }
public IEnumerable<SomethingRelation> Relations { get; set; }
public void RemoveSomething2(ISomething2 something2){
//iterate through SomethingRelation and remove all the something2 reference
}
}
公共类something关系{
公共事物;
公共等距2某物2;
}
公共类管理器类{
公共IEnumerable等距对象{get;set;}
公共IEnumerable等轴测2{get;set;}
公共IEnumerable关系{get;set;}
公共void移除某物2(等轴测2某物2){
//迭代SomethingRelation并删除所有something2引用
}
}
这个问题太宽泛了。我只能说你应该努力缩小你的问题范围。太宽泛的话会得到有见解的答案吗?也许我可以保留第一个项目符号,编辑您的问题以缩小范围。删除此项目可能有效,但枚举它却无效,因为它们可以单独定义。是的,如果您想正确添加和删除,您确实需要它来创建自己的IEnumberable实现。但是,您有很多未回答的问题,例如“如果我添加我的classb,然后再添加一个classA和该classb”,JSON序列化是将复杂对象简化为简单poco classI的另一个很好的论据。我会说poco意味着所有属性都是值类型?所以你的ClassB使它成为一个复杂的对象。将其更改为字符串classBId
public class SomethingRelation{
public ISomething something;
public ISomething2 something2;
}
public class ManagerClass{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 { get; set; }
public IEnumerable<SomethingRelation> Relations { get; set; }
public void RemoveSomething2(ISomething2 something2){
//iterate through SomethingRelation and remove all the something2 reference
}
}