簡體   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