Проблема заключается в Ковариантности и Контравариантности в Обобщениях , как говорят SLaks DataEntryControl
не то же самое, что BankDataEntryControl
, хотя Они являются наследственными отношениями.
Начиная с .NET Framework 4, в Visual Basic и C # есть ключевые слова, позволяющие пометить параметры универсального типа интерфейсов и делегатов как ковариантные или контравариантные.
так что вы можете попытаться создать интерфейс для этого класса.
ICatalogDataEntryForm<out T>
для CatalogDataEntryForm<T>
ICatalogDataGridForm<out T>
для CatalogDataGridForm<T>
тогда пусть эти классы реализуют интерфейс
public interface ICatalogDataEntryForm<out T>
{ }
public interface ICatalogDataGridForm<out T>
{ }
public class CatalogDataEntryForm<T> : ICatalogDataEntryForm<T>
{ }
public class CatalogDataGridForm<T> : ICatalogDataGridForm<T>
{}
BankDataGridForm
и BankDataEntryForm
менять не нужно.
public class BankDataGridForm : CatalogDataGridForm<BankDataGridControl>
{
}
public class BankDataEntryForm : CatalogDataEntryForm<BankDataEntryControl>
{
}
public class BankManager : CatalogManager<BankDataEntryForm, BankDataGridForm,CatalogBusinessObject>
{
public BankManager()
{
}
}
Тогда позвольте CatalogManager
заключить класс с этими интерфейсами
public class CatalogManager<T1, T2, T3> where T1 : ICatalogDataEntryForm<DataEntryControl>, new()
where T2 : ICatalogDataGridForm<DataGridControl>, new()
where T3 : CatalogBusinessObject
{
public CatalogManager()
{
}
}
c # online