在类属性'set' 'value'上设置属性

  • 本文关键字:属性 设置 value set c#
  • 更新时间 :
  • 英文 :


我有两个类需要了解彼此。

在我的示例中,我使用的是带房间的房子。

House需要了解Rooms,Rooms也需要了解House。

我目前有一个设置,我在映射中做了类似的事情:

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上,我可能需要迭代所有属于它的Rooms来执行其他计算。

我希望这是清楚的,如果不是,我可以尝试详细说明。

再次感谢。

我认为使用设置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()方法一次完成链接和添加。

这是一种糟糕的做法,我强烈建议不要这样做。总是尽量让对象只指向彼此依赖的一个方向。有一些非常有效的方法可以做到这一点,但关于让两个对象都知道彼此,我建议不要这样做。如果你同意,你可能不同意,那么再添加一点代码,说明为什么房间需要了解房子,反之亦然,我会以我觉得你会喜欢的方式给你尽可能简单的代码格式。

最新更新