类设计和对象引用

时间:2015-03-06 13:57:07

标签: 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 MyProject : BaseProject
{
    public IEnumerable<ISomething> ISomethings { get; set; }
    ...
    public IEnumerable<ISomething2> ISomethings2 { get; set; }
    ...
}

这里的问题是我必须保留ClassA的ISomethings2classb属性列表,以仅引用ISomething2列表中的现有项。这里很难的是:

  • ISomething2中删除项目应删除对它的所有引用(ClassA实例的classb属性设置为null)
  • 阻止其他开发人员将classb属性设置为列表中的非现有对象或新用户创建的对象。
  • ISomethings2中的对象可以存在而不被引用。

这些类用于项目描述而不是数据库的东西。就像打开应用程序的项目文件一样。因此,更改classB中的属性应该对所有人都可见,因为它是相同的对象引用。 是否有一种模式可以实现我想要的而不需要很多耦合?也欢迎替代设计/方法。

2 个答案:

答案 0 :(得分:1)

您需要一个Manager类,并在您的类中添加一些行为。

首先是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
    }
}

ClassA接受ManagerClass构造函数,撤销ClassB设置属性。

public class ClassA : ISomething
{
    public ClassA (ManagerClass managerClass){
        this.managerClass = managerClass;
    }

    public double Property { get; set; }

    private ManagerClass managerClass = null;
    public ManagerClass ManagerClass { get { return managerClass; } }

    private ClassB classB null;
    public ClassB ClassB { get{ return classB; } }

    public void SetClassB(ClassB classB){
        // check whether 
        if(classB != null && !ManagerClass.ISomethings.Any(k=> k==classB)){
            this.classB = classB;
        }
        // set null
        else if(classB == null){
            this.classB = null;
        }
        else {
            throw new Exception("not found");
        }
    }
}

虽然我更喜欢带关系模型的简化版本。

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

答案 1 :(得分:0)

嗯,personaly我会用ClassBId替换ClassA中的ClassB对象,只有一个列表。

BUT!如果你想保留结构,你可以使项目ISomething2可枚举链接到ISomethign1可枚举。即

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