我的班级设计有问题。
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#,但这是一个普遍的问题..
我可以使用哪些其他可能性?
答案 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
指向B
而B
同时指向A
。这是表示双向关系的标准做法,就像您正在谈论的那样。它没有错。
答案 2 :(得分:0)
方法属于A,并且A调用B的方法(可能将A的信息作为参数传递给B)。你认为让B负责分发/处理A的信息是一个值得怀疑的设计决定是正确的。
答案 3 :(得分:0)
两个建议:
答案 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)
希望这有帮助。