我有两个需要彼此了解的课程。
在我的例子中,我正在使用House with Rooms。
众议院需要了解房间,房间需要了解房屋。
我目前有一个设置,我在我的映射中做了类似的事情:
var house = new House();
var room = new Room(house);
house.Rooms.Add(room);
通过这样做,我将房子连接到房间和房间到房子。
我想知道,做以下事情是不好的做法吗?
private House house;
public House House
{
get
{
return house;
}
set
{
house = value;
value.Rooms.Add(this);
}
}
这样,无论何时创建一个房间,它都会自动添加到房屋的房间列表中。
如果这是不好的做法,我还有其他选择吗?
感谢。
我这样做的原因是因为我正在创建多种类型的输出对象,而这些不同的输出对象需要不同的答案。
我正在进行的计算会花费很多时间,所以我希望他们只计算他们需要的东西。
通过让两个班级互相认识,我即将在Room上调用一个需要House输入的属性,并且只有在我真正需要时才会计算出来。
E.g。
public class Room {
public House House { get; set; }
public double Size { get; set; }
public double GetSizePercent()
{
return Size / House.TotalSize;
}
}
在我的真实世界应用程序中,还有很多属性可以从House类访问,在本例中,其他类也需要了解House.TotalSize。
此外,在House上,我可能需要遍历属于它的所有房间以执行其他计算。
我希望这很清楚,如果没有,我可以尝试详细说明。
再次感谢。
答案 0 :(得分:2)
我会考虑使用设置House属性的副作用来添加它是一个不好的做法。属性设置器应该设置属性。导致它做一些无关的事情,例如将对象添加到集合中,当其他人试图在以后跟踪它时,会产生非常难以理解的代码。
我会做这样的事情:
public class House {
public House() {
Rooms = new List<Room>();
}
public Room CreateRoom() {
Room result = new Room(this);
Rooms.Add(result);
return result;
}
public List<Room> Rooms { get; private set; }
public class Room {
public Room(House house) {
this.House = house;
}
public House { get; private set; }
}
}
通常,我还希望阻止代码错误地使用我的类 - 例如创建链接到House的房间但忘记将其添加到Rooms,或者将其添加到Rooms但是错误地设置House属性。要解决这个问题,我会实现类似的东西:
public class House {
private List<Room> rooms;
public House() {
rooms = new List<Room>();
Rooms = new ReadOnlyList<Room>(rooms);
}
public Room CreateRoom() {
Room result = ((IRoomFactory)Room.Factory.Instance).Create(this);
rooms.Add(result);
return result;
}
public ReadOnlyList<Room> Rooms { get; private set; }
private interface IRoomFactory {
Room Create(House house);
}
public class Room {
public class Factory : IRoomFactory {
public static readonly Factory Instance = new Factory();
Room IRoomFactory.Create (House house) {
return new Room(house);
}
}
private Room(House house) {
this.House = house;
}
public House { get; private set; }
}
}
然后,当你想为你的房子增加一个房间时,你只需要打电话
var house = new House();
var room = house.CreateRoom();
现在,您无法在House课程之外的任何地方创建一个房间,也无法从外部向Class集合中添加房间。唯一的方法是在House内部,它负责链接并通过CreateRoom()方法一次性添加。
答案 1 :(得分:-1)
这是不好的做法,我强烈建议不要这样做。始终尝试让对象仅指向彼此依赖的一个方向。有很多有效的方法可以使这项工作,但至于让两个对象彼此了解我会建议反对它。如果你同意,你可能没有,那么再添加一些代码,说明为什么房间需要知道房子,反之亦然,我会给你尽可能简单的代码格式,就像我觉得你想的那样升值。