Как добавить список объектов класса в класс? - PullRequest
0 голосов
/ 13 февраля 2019

У меня 3 класса: дом, квартира и резидент.Каждый класс имеет базовые свойства, такие как имя строки.Вопрос в том, как создать между ними такие ссылки:

1.Класс дома должен иметь квартирную собственность (квартиры как список (?), Потому что в одном доме может быть несколько квартир)

2.Квартира класса с имуществом Дом (однокомнатная) (дом, в котором находится квартира).Также коллекция (список?) Resident (людей, которые живут в квартире).

3.Класс резидента с собственностью Apartment (single).

Я создал структуру этих классов, используя наследование, но это не работает - не могу создать Дом без указания квартиры, не могу добавить квартиру без дома ии так далее.

public class House
{
    public int number { get; set; }
    public string street { get; set; }
    public List<Apartment> apartments = new List<Apartment>();
}
public class Apartment:House
{
    public int apt_number { get; set; }
    public int apt_Rooms { get; set; }
    public House house;
    public List<Resident> residents = new List<Resident>();
}
public class Resident
{   public string name {get;set;}
    public string surname {get;set}
    public Apartment apartment {get;set}
}

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Сефе задает хороший вопрос относительно ваших классов.

Вы не должны заставлять квартиру наследовать от Дома.

Эта концепция имеет больше смысла, если у вас есть, скажем, класс "Fruit" со свойствами,Тогда у вас есть некоторые специфические классы, такие как «Apple» или «Груша», которые наследуются от «Fruit».Все они имеют одинаковые свойства Fruit, а также имеют свои собственные.

Чтобы исправить вашу конкретную проблему: вы забыли некоторые ';'и я снял наследство.Также вы не указали получить или установить для списков или имущества дома внутри квартиры.Для создания переменных классов смотрите пост выше от Aars93.

public class House
{
    public int number { get; set; }
    public string street { get; set; }
    public List<Apartment> apartments = new List<Apartment>();
}

public class Apartment
{
    public int apt_number { get; set; }
    public int apt_Rooms { get; set; }
    public House house;
    public List<Resident> residents = new List<Resident>();
}

public class Resident
{   public string name {get;set;}
    public string surname {get;set;}
    public Apartment apartment {get;set;}
}
0 голосов
/ 13 февраля 2019

Наследственность - это не то же самое, что композиция.Когда вы наследуете B от A, вы говорите "B - это A".В вашем случае, когда вы наследуете Apartment от House, вы говорите: «Apartment - это House».Это, очевидно, неправда, поскольку квартира - это не дом, а часть дома.Так что Apartment не должен наследоваться от House.

Отношение , являющегося частью , выражается композицией.Вы сделали это, добавив список квартир в House (и свойство House в Apartment).

Однако обычно вы хотите сохранить целостность между списком родителей и родительским свойством ребенка.,Например, когда вы добавляете Apartment к House, вы хотите, чтобы Apartment.House был установлен соответствующим образом.

Этого нельзя добиться с помощью List<T>.На самом деле List<T> не предназначен для использования в качестве публичной собственности такого рода, но для внутреннего хранения данных.Для ваших целей вам понадобится System.Collections.ObjectModel.Collection<T>, который разрешит необходимую вам настройку.

Так будет работать для отношений между House и Apartment.Вы должны сделать то же самое для Apartment и Resident:

public class House
{
    public int Number { get; set; }
    public string Street { get; set; }
    public ApartmentCollection Apartments { get; private set; }

    public House() {
        Apartments = new ApartmentCollection(this);
    }
}

public class Apartment
{
    private House house;

    public int AptNumber { get; set; }
    public int AptRooms { get; set; }
    public House House {
        get {
            return house;
        }
        set {
            house?.Apartments.Remove(this);
            house = value;
            house?.Apartments.Add(this);
        }
    }
    public List<Resident> Residents = new List<Resident>();
}

public class ApartmentCollection : Collection<Apartment> {
    private readonly House parent;

    public ApartmentCollection(House parent) {
        this.parent = parent;
    }

    protected override void InsertItem(int index, Apartment item) {
        if (item == null) {
            throw new ArgumentNullException(nameof(item));
        }
        if (Contains(item)) {
            return;
        }

        base.InsertItem(index, item);
        item.House = parent;
    }

    protected override void SetItem(int index, Apartment item) {
        if (item == null) {
            throw new ArgumentNullException(nameof(item));
        }

        Apartment oldItem = this[index];
        if (oldItem.Equals(item)) {
            return;
        }

        int oldIndexOfItem = IndexOf(item);
        base.SetItem(index, item);
        oldItem.House = null;
        item.House = parent;

        //If the item was in the collection before, remove it from its old position
        if (oldIndexOfItem >= 0) {
            base.RemoveItem(oldIndexOfItem);
        }
    }

    protected override void RemoveItem(int index) {
        Apartment removedItem = this[index];
        base.RemoveItem(index);
        removedItem.House = null;
    }

    protected override void ClearItems() {
        Apartment[] removedItems = new Apartment[Count];
        CopyTo(removedItems, 0);
        base.ClearItems();
        foreach(Apartment removedItem in removedItems) {
            removedItem.House = null;
        }
    }
}

Теперь вы можете сделать как установить Apartment.House, так и добавлять и удалять элементы из House.Apartments.Другая сторона всегда будет автоматически обновляться.Кроме того, ApartmentCollection предотвратит добавление одной и той же квартиры дважды или добавление значения null к коллекции квартир.A List<T> не делает ни того, ни другого.

0 голосов
/ 13 февраля 2019

Как указано в комментариях, (по-видимому) бесполезно делать квартиру наследовать дом.Если вы удалите наследство, вы можете создать несколько объектов «Квартира» со ссылкой на объект «Дом» и добавить их в список «Квартира» в доме.

House house = new House();
Apartment app1 = new Apartment { house = house };
Apartment app2 = new Apartment { house = house };
Apartment app3 = new Apartment { house = house };

house.apartments = new List<Apartment>{ app1, app2, app3 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...