簡體   English   中英

類設計和對象引用

[英]Class design and object references

這是我正在嘗試做的非常基本的例子。 實際上,存在更多的關系,但沒有極端的關系或記憶沉重的關系。

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

這里的問題是,我必須保留ISomethings2的列表,然后classb ClassA的classb屬性,以僅引用ISomething2列表中的現有項。 這里的難點是:

  • ISomething2刪除項目應刪除對其的所有引用(將ClassA實例的classb屬性設置為null)
  • 防止其他開發人員將classb屬性設置為列表中不存在的對象或新的用戶創建的對象。
  • ISomethings2對象可以存在而無需引用。

這些類用於項目描述, 而不是數據庫內容。 就像打開應用程序的項目文件時一樣。 因此,更改classB中的屬性應該是所有人可見的,因為它是同一對象引用。 是否有一種無需太多耦合即可實現我想要的模式? 也歡迎其他設計/方法。

您需要一個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 set屬性。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM