[英]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.