Generic классы в связи “многие ко многим”

228
30 сентября 2017, 19:34

Есть 3 класса которые реализуют связь данных "многие ко многим":

PClient

public class PClient
{
    public string Name;
    public int Number;
    public List<Phone> ProductCollection = new List<Phone>();
}

PManufacturer

public class PManufacturer
{
    public string Name;
    public string ProcessorManufacturer;
    public List<Phone> ProductCollection = new List<Phone>();
}

Phone

public class Phone: IDisposable
{
    public PClient Client;
    public PManufacturer Manuf;
    public DateTime ProdYear;
    public void Dispose()
    {
        if(Client != null && Client.ProductCollection != null)
            Client.ProductCollection.Remove(this);
        if (Manuf != null && Manuf.ProductCollection != null)
            Manuf.ProductCollection.Remove(this);
    }
}

Так-же есть тройка классов которая в многом по логике и данным совпадают с этой тройкой.

BClient

public class BClient
{
    //Присутствует в PClient
    public string Name;
    //Отсутствует в PClient
    public int Weight;
    //Отличается от PClient переданным типом
    public List<Bicycle> ProductCollection = new List<Bicycle>();
}

BManufacturer

public class BManufacturer
{
    //Присутствует в PManufacturer
    public string Name;
    //Отсутствует в PManufacturer
    public string WheelManufact;
    //Отличается от PManufacturer переданным типом
    public List<Bicycle> ProductCollection = new List<Bicycle>();
}

Bicycle

public class Bicycle
{
    //Присутствует в Phone
    public BClient Client;
    public BManufacturer Manuf;
    //Отсутствует в Phone
    public int NumberOfWheel;
    //Совпадает с Phone
    public void Dispose()
    {
        if (Client != null && Client.ProductCollection != null)
            Client.ProductCollection.Remove(this);
        if (Manuf != null && Manuf.ProductCollection != null)
            Manuf.ProductCollection.Remove(this);
    }
}

т.к. все эти классы попарно во многом похожи, все сходства желательно вынести в базовые классы.

Вопрос: Как я могу это сделать?

Сам пытался реализовать базовые классы через Generic но постоянно нарываюсь на ошибку вроде:

Answer 1

Вы значительно переусложняете. дело в том, что в вашей реализации вряд ли нужен Dispose (во всяком случае для этих классов и в том виде, в котором он реализован). Dispose нужен для освобождения ресурсов, у вас же их нет. Без Dispose ваш код можно свести к такому:

public abstract class Base<T>            
{
    public string Name;
    public List<T> ProductCollection = new List<T>();
}
public abstract class BaseProduct<TClient, TManufacturer, TProd> 
    where TClient : Base<TProd>
    where TManufacturer : Base<TProd>
{
    public TClient Client;
    public TManufacturer Manuf;
    public DateTime ProdYear;            
}
public class Phone : BaseProduct<PClient, PManufacturer, Phone>
{
}
public class Bicycle : BaseProduct<BClient, BManufacturer, Bicycle>
{
    //Отсутствует в Phone
    public int NumberOfWheel;
}
public class PClient : Base<Phone>
{
    public int Number;
}
public class PManufacturer : Base<Phone>
{
    public string ProcessorManufacturer;
}
public class BClient : Base<Bicycle>
{
    //Отсутствует в PClient
    public int Weight;
}
public class BManufacturer : Base<Bicycle>
{
    //Отсутствует в PManufacturer
    public string WheelManufact;
}

Если же IDisposable прям нужен кровь из носу, то всё будет несколько сложнее, и тогда код становится менее естественным:

public abstract class AbstractProduct
{
}
public abstract class Base<T>
            where T: AbstractProduct
{
    public string Name;
    public List<T> ProductCollection = new List<T>();
}
public abstract class BaseProduct<TClient, TManufacturer, TProd>  : AbstractProduct, IDisposable
    where TClient: Base<TProd>
    where TManufacturer: Base<TProd>
    where TProd : AbstractProduct
{
    public TClient Client;
    public TManufacturer Manuf;
    public DateTime ProdYear;
    public void Dispose()
    {
        var that = this as TProd;
        if (Client != null && Client.ProductCollection != null)
            Client.ProductCollection.Remove(that);
        if (Manuf != null && Manuf.ProductCollection != null)
            Manuf.ProductCollection.Remove(that);
    }
}
READ ALSO
Подключение к WCF-сервису, блок Security

Подключение к WCF-сервису, блок Security

Добрый день всемПытаюсь подключиться к WCF-сервису, используется стандарт WS-Security

278
C# - Одинаковые данные в массиве

C# - Одинаковые данные в массиве

Допустим есть массив: string[] names = new {"иван", "катя", "максим", "катя", "катя", "иван", "лёша"} Мне нужно получить имя, которое встречается большее кол-во...

253
c# ошибка при сериализации

c# ошибка при сериализации

Собственно текст ошибки:

228