[英]Setting a property on 'value' in 'set' auto-property on class property
我有两个需要相互了解的类。
在我的示例中,我使用的是带房间的房子。
房子需要了解房间,房间需要了解房子。
我目前有一个设置,我在我的映射中做类似的事情:
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 输入的属性,并且只有在我真正需要它时才会对其进行计算。
例如
public class Room {
public House House { get; set; }
public double Size { get; set; }
public double GetSizePercent()
{
return Size / House.TotalSize;
}
}
在我的实际应用程序中,House 类可以访问更多属性,在本例中,其他类也需要了解 House.TotalSize。
此外,在 House 上,我可能需要遍历属于它的所有房间以执行其他计算。
我希望这很清楚,如果没有,我可以尝试详细说明。
再次感谢。
我会考虑使用设置 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 类之外的任何地方创建房间,也不能从外部向类的 Rooms 集合添加房间。 唯一的方法是从 House 内部进行,它通过 CreateRoom() 方法处理所有的链接和添加。
这是不好的做法,我强烈建议不要这样做。 总是尽量让对象只指向彼此依赖的一个方向。 有很多有效的方法可以使这项工作有效,但至于让两个对象相互了解,我建议反对它。 如果您同意(也可能不同意),请添加更多代码,说明为什么房间需要了解房子,反之亦然,我会以我认为您会喜欢的方式为您提供尽可能简单的代码格式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.