Есть 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 но постоянно нарываюсь на ошибку вроде:
Вы значительно переусложняете. дело в том, что в вашей реализации вряд ли нужен 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);
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день всемПытаюсь подключиться к WCF-сервису, используется стандарт WS-Security
Допустим есть массив: string[] names = new {"иван", "катя", "максим", "катя", "катя", "иван", "лёша"} Мне нужно получить имя, которое встречается большее кол-во...