2011-08-02 53 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无论如何)

希望这会有所帮助。