C# 数据关系问题

C# 数据关系问题,c#,class-design,C#,Class Design,我的课堂设计有问题 我有两个班: public class A { public B[] _bs; public string _name; } public class B { public string getAName() { // The problem } } 换句话说:我有两个班A和B。 A班有很多B,A班只有一个A 那很容易。但是现在我需要一个从a到B的方法的属性 当然,我可以创造一些像 public class B { p

我的课堂设计有问题

我有两个班:

public class A {
    public B[] _bs;
    public string _name;
}
public class B {
    public string getAName() {
        // The problem
    }
}
换句话说:我有两个班A和B。 A班有很多B,A班只有一个A

那很容易。但是现在我需要一个从a到B的方法的属性

当然,我可以创造一些像

public class B {
    public A _parent;
    public string getAName() {
        return _parent._name;
    }
}
但我认为这不是一个好的设计

我的编程语言是C#,但这是一个普遍的问题


我还可以使用哪些其他可能性?

您的解决方案是正常的方法。我甚至想不出另一种可能的方法来做它,而不做一些荒谬的事情,比如反编译dll。可能保留一个a的列表,让B找到它所在的a,但仍然是非常错误的。

您有什么理由不想为您的
B
公开整个
a

public class B
{
    public A A {get;set;}
}
因此,不是:

var aName = b.getAName();
。。。你会说:

var aName = b.A.Name;
(在我的世界中,您将
名称
属性设置为公共,并将
名称
字段设置为私有。)


但是一般来说,听起来你关心的是让
A
指向
B
B
同时指向
A
。这是表示双向关系的标准做法,就像您所说的那样。它没有问题。

让方法属于A,让A调用B的方法(可能将A的信息作为参数传递给B)。您认为让B负责分发/处理a的信息是一个有问题的设计决策是正确的。

两个建议:

  • 如果属性是固定的,它可以是B构造函数的参数,因此B仍然不知道A
  • A实现一个接口,接口仅公开特定属性,B引用该属性。您可以简单地传递它,设置它,或者使用依赖注入
报告指出:

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

AAAA
AAAA
AAAA
但和往常一样,当然有不止一个“好”的解决方案:) (例如,您可以向B添加一个构造函数,其中传递对a的引用)

(注意使用AddB()而不是ListOfB.Add(),否则InstanceOfA不会被设置(当然,您也可以自己设置并将其添加到ListOfB中)


希望这能有所帮助。

我可能会建议将setter设置为私有,而将getter设置为公共。@pstrjds:这可能是合适的,取决于我们正在做什么。甚至最好让setter从引用的
A
中的
\u bs
列表中添加/删除
,这样它实际上会改变双方关系。这是在实体框架之类的东西中实现的方式。当然,这也很好。我只是在想,如果一个的setter被暴露,那么就会出现不同步的危险。
foreach(B b in A.ListOfB)
{
    Console.WriteLine(b.InstanceOfA.Name);
}
AAAA
AAAA
AAAA