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