2011-08-02 89 views
1

我的課堂設計有問題。數據關係問題

ICH有2類:

public class A { 
    public B[] _bs; 
    public string _name; 
} 
public class B { 
    public string getAName() { 
     // The problem 
    } 
} 

在的話:我有兩個類A和B. A類有許多B的和B具有隻有一個!

這很容易。但現在我需要從A屬性通過B的

相信我能夠創造這樣

public class B { 
    public A _parent; 
    public string getAName() { 
     return _parent._name; 
    } 
} 

但這種方法,我認爲,沒有好的設計......

我的編程語言是C#但這是一個普遍問題。

我還可以使用其他什麼方法?

回答

1

您的解決方案是正常的做法。我甚至不能想到另一種可能的方式來做到這一點,而不需要像反編譯dll那樣做一些荒謬的事情。可能保留A的列表並讓B找到它所在的A,但仍然非常錯誤。

1

是否有任何理由不希望爲您的B公開整個A

public class B 
{ 
    public A A {get;set;} 
} 

所以不是:

var aName = b.getAName(); 

...你會說:

var aName = b.A.Name; 

(在我的世界,你犯了一個公共Name財產和取得的_name私人領域)

但是一般來說,聽起來好像你擔心的是有A指向BB指向A在同一時間。代表您所談論的雙向關係時,這是標準做法。它沒有什麼問題。

+0

我可能會推薦讓setter變爲private並讓getter公開。 – pstrjds

+0

@pstrjds:這可能是適當的,取決於我們在做什麼。讓setter從引用的'A'的'_bs'列表中添加/移除'this'甚至會更好,因此它實際上改變了關係的兩端。這就是它在諸如實體框架之類的事情上的做法。 – StriplingWarrior

+1

當然,這也會很好。我只是想着如果A的二傳被曝光的話,會有不同步的危險。 – pstrjds

0

讓方法屬於A,並讓A調用B的方法(可能將A的信息傳遞給B作爲參數)。你認爲讓B負責分發/處理A的信息是一個有問題的設計決定是正確的。

0

兩個建議:

  • 如果該屬性是固定的,也可以是參數到B構造所以B仍然完全不認識有關
  • 一個實現接口和接口公開特定屬性(IES)只和B有參考。你可以簡單地通過它,將它設置或獲取看中,並使用依賴注入
0
public class A 
{ 
    public List<B> _listOfB; 
    public string Name { get; set; } 

    public List<B> ListOfB 
    { 
     get { return _listOfB; } 
    } 

    public A() 
    { 
     ListOfB = new List<B>(); 
    } 

    public void AddB(B b) 
    { 
     B.InstanceOfA = this; 
     ListOfB.Add(b); 
    } 



} 

public class B 
{ 
    public A InstanceOfA { get; set; } 
} 

添加B的爲A:

A a = new A(); 
a.Name = "AAAA"; 
A.AddB(new B()); 
A.AddB(new B()); 
A.AddB(new B()); 

在此:

foreach(B b in A.ListOfB) 
{ 
    Console.WriteLine(b.InstanceOfA.Name); 
} 

會導致在:

AAAA 
AAAA 
AAAA 

但是,一如既往地有一個以上的「好」解決方案:) (例如,你可以添加一個構造函數B,你傳遞一個參考到A)

(注意你使用AddB )而不是ListOfB.Add(),否則InstanceOfA沒有設置(當然,你可以自己設置它,並將其添加到ListOfB無論如何)

希望這會有所幫助。