Как правильно настроить реализацию интерфейса и совместимость типов? ⇐ C#

Место общения программистов C#
Anonymous
Как правильно настроить реализацию интерфейса и совместимость типов?

Сообщение Anonymous »

Я хочу иметь (классический) словарь пользовательских классов словарей, которые все наследуют от одного и того же класса Dictionary, который, в свою очередь, реализует интерфейс.
У меня есть интерфейс: общедоступный интерфейс IPMSDictionary где T : DictionaryItem
Затем базовый класс, который его реализует: открытый абстрактный класс DictionaryBase : IPMSDictionary где T : DictionaryItem
У меня также есть несколько производных классов, например:
public class SpeciesDictionary : DictionaryBase
public class VarianceDictionary : DictionaryBase
С другим отношением наследования: общедоступный класс DictionaryItem и его производные:
public class SpeciesItem : DictionaryItem
public class VarianceItem : DictionaryItem
Теперь я настроил словарь public Dictionary Dictionaries { get; набор; } = new Dictionary();, чтобы иметь возможность хранить все словари в одном месте и получать к ним доступ по строковому ключу, добавляя их следующим образом: Warehouse.Storage.Dictionaries.Add( "S_Gatunki", новый SpeciesDictionary(Warehouse.Storage.Procedures["ListaGatunkow"]) как IPMSDictionary); но каждый раз я пытаюсь получить словарь:
if (Warehouse.Storage.Dictionaries.TryGetValue("S_Gatunki", out var dict))
{
if (dict is SpeciesDictionary speciesDict)
{
Console.WriteLine("Got it");
}
else
{
Console.WriteLine("its null");
}
}

оно всегда равно нулю. Я предполагаю, что я путаю свои типы, но я не могу найти решение этой проблемы, если только я не пытаюсь достичь чего-то невозможного? Ниже приведен весь код:
Warehouse.cs:
public class Warehouse
{
private static Warehouse instance;
private Warehouse() { }

public static Warehouse Storage
{

get
{
if (instance == null)
{
instance = new Warehouse();
}
return instance;
}
}

public Dictionary Dictionaries { get; set; } = new Dictionary();
public Dictionary Procedures { get; set; } = new Dictionary();
}

IPMSDictionary.cs:
public interface IPMSDictionary where T : DictionaryItem
{
DbProcedureSealed Procedure { get; }
DataTable DataFromDB { get; set; }
List DictionaryList { get; set; }
List TableAsView { get; set; }

DataTable GetTableFromDb(DbProcedureSealed procedure);
T FindDataItem(List list, Func predicate);
T SearchByName(string name);
T SearchByID(int id);
int AddDataItem(T item, DbProcedureSealed procedure, string outputParam, SqlDbType outputType);
string EditDataItem(T newItem, DbProcedureSealed procedure, string outputParam, SqlDbType outputType);
string DeleteDataItem(T item, DbProcedureSealed procedure, string outputParam, SqlDbType outputType);
T[] ListAllItems();
}

DictionaryBase.cs:
public abstract class DictionaryBase : IPMSDictionary where T : DictionaryItem
{
public DbProcedureSealed Procedure { get; }

public DataTable DataFromDB { get; set; }
public List DictionaryList { get; set; }
public List TableAsView { get; set; }

public int AddDataItem(T item, DbProcedureSealed procedure, string outputParam, SqlDbType outputType)
{
// Implementation
}

public string DeleteDataItem(T item, DbProcedureSealed procedure, string outputParam, SqlDbType outputType)
{
// Implementation
}

public string EditDataItem(T item, DbProcedureSealed procedure, string outputParam, SqlDbType outputType)
{
// Implementation
}

public T FindDataItem(List list, Func predicate)
{
// Implementation
}

public DataTable GetTableFromDb(DbProcedureSealed procedure)
{
// Implementation
}

public T[] ListAllItems()
{
// Implementation
}

public T SearchByID(int id)
{
// Implementation
}

public T SearchByName(string name)
{
// Implementation
}
}

SpeciesDictionary.cs (VarianceDictionary — тот же, но другая реализация):
public class SpeciesDictionary : DictionaryBase
{
public SpeciesDictionary(DbProcedureSealed proc)
{
// Constructor
}

public List GetDataItemsAsList(DataTable table)
{
// Implementation
}
}

И, наконец, классы «Item», все в одном файле, если это имеет значение:
public class DictionaryItem
{
public int ID { get; set; }
public string Name { get; set; }

public DictionaryItem()
{

}
}

public class SpeciesItem : DictionaryItem
{
public SpeciesItem()
{

}

public SpeciesItem(int id, string sName)
{
this.ID = id;
this.Name = sName;
}
}

public class VarianceItem : DictionaryItem
{
public int SpeciesId { get; set; }

public VarianceItem()
{

}

public VarianceItem(int vId, int sId, string vName)
{
this.ID = vId;
this.SpeciesId = sId;
this.Name = vName;
}
}

public class PackageItem : DictionaryItem
{
public string PackageCode { get; set; }
public string Weigth { get; set; }

public PackageItem()
{

}

public PackageItem(int id, string code, string name, string wgth)
{
this.ID = id;
this.PackageCode = code;
this.Name = name;
this.Weigth = wgth;
}
}

public class RelishItem : DictionaryItem
{
public RelishItem()
{

}

public RelishItem(int id, string name)
{
this.ID = id;
this.Name = name;
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... patibility

Вернуться в «C#»