类设计和对象引用

本文关键字:对象引用 | 更新日期: 2024-10-18 05:44:06

这是我尝试做的一个非常基本的例子。在现实中,有更多的关系,但不是极端的或记忆沉重的东西。

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中的对象可以在不被引用的情况下存在

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

类设计和对象引用

您需要一个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
    }
}

嗯,我个人会用字符串ClassBId替换ClassA中的ClassB对象,并且只有一个列表。

但是!如果你想保留结构,你可以让项目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;
            }
        }
    }