数据关系问题

时间:2011-08-02 14:48:36

标签: c# class-design

我的班级设计有问题。

Ich有两个班级:

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

用语言说:我有两个A和B类。 A类有很多B,而B只有一个A!

这很容易。但是现在我需要一个来自A的属性来通过B的方法。

当然,我可以创建像

这样的东西
public class B {
    public A _parent;
    public string getAName() {
        return _parent._name;
    }
}

但是,我认为这不是一个好的设计......

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

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

5 个答案:

答案 0 :(得分:1)

您的解决方案是正常的方法。我甚至想不出另一种可行的方法来做这件事,而不做像反编译那样荒谬的事情。可能保留A的列表并让B找到它所在的A,但仍然非常错误。

答案 1 :(得分:1)

您是否有任何理由不想公开A的整个B

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

所以而不是:

var aName = b.getAName();

...你会说:

var aName = b.A.Name;

(在我的世界中,您创建了一个公开Name属性并将_name字段设为私有。)

但总的来说,听起来您关注的是A指向BB同时指向A。这是表示双向关系的标准做法,就像您正在谈论的那样。它没有错。

答案 2 :(得分:0)

方法属于A,并且A调用B的方法(可能将A的信息作为参数传递给B)。你认为让B负责分发/处理A的信息是一个值得怀疑的设计决定是正确的。

答案 3 :(得分:0)

两个建议:

  • 如果属性是固定的,它可以是B构造函数的参数,所以B仍然不知道A
  • 实现接口,接口只暴露特定属性,B引用它。您可以简单地传递它,设置它或获得幻想并使用依赖注入

答案 4 :(得分: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)

希望这有帮助。