Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类设计和对象引用_C#_Design Patterns_Architecture - Fatal编程技术网

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
    中删除项应删除对该项的所有引用(
    classb
    将ClassA实例的属性设置为null)
  • 防止其他开发人员将
    classb
    属性设置为列表中不存在的对象或新的用户创建的对象
  • ISomethings2
    中的对象可以不被引用而存在
这些类用于项目描述而不是数据库内容。就像打开应用程序的项目文件一样。因此,更改classB中的属性应该对所有人都可见,因为它是相同的对象引用。
有没有一种模式可以在没有太多耦合的情况下实现我想要的?也欢迎其他设计/方法。

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
    }
}