繁体   English   中英

在类属性的“设置”自动属性中设置“值”的属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM