在类属性的'set'自动属性中的'value'上设置属性

时间:2017-01-30 02:34:30

标签: c#

我有两个需要彼此了解的课程。

在我的例子中,我正在使用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上,我可能需要遍历属于它的所有房间以执行其他计算。

我希望这很清楚,如果没有,我可以尝试详细说明。

再次感谢。

2 个答案:

答案 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)

这是不好的做法,我强烈建议不要这样做。始终尝试让对象仅指向彼此依赖的一个方向。有很多有效的方法可以使这项工作,但至于让两个对象彼此了解我会建议反对它。如果你同意,你可能没有,那么再添加一些代码,说明为什么房间需要知道房子,反之亦然,我会给你尽可能简单的代码格式,就像我觉得你想的那样升值。