#c# #oop #inheritance #.net-core
#c# #ООП #наследование #.net-ядро
Вопрос:
Я хотел бы спросить, как я могу получить такую подпись в dotnet? У меня есть эти три метода
public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;AllianceOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;SquadOpenPositiongt; squadOpenPositions, uint squadId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;TribeOpenPositiongt; tribeOpenPosition, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)
Как вы можете видеть, единственное различие между подписью-это тип списка, полученного в качестве входных данных. Все три модели объединены в базовый абстрактный класс, называемый OpenPositionBase
Я хотел бы создать интерфейс, чтобы ограничить объект для реализации метода GetOpenPositions.
Я попытался создать что-то подобное
public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;OpenPositionBasegt; tribeOpenPosition, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)
Общий базовый класс
public class OpenPositionBase { public uint OpenPositionId { get; set; } }
Позиция альянса
public class AllianceOpenPosition : OpenPositionBase { public AllianceOpenPosition() { Alliance = new Alliance(); LeadRole = new LeadRole(); } public uint Id { get; set; } public uint AllianceId { get; set; } public uint LeadRoleId { get; set; } }
Этот класс является реализацией интерфейса IPositionConverter, в котором я ищу, чтобы добавить метод GetOpenPositions в общем виде, поэтому в классе SquadPositionConverter я мог бы использовать этот метод как GetOpenPositions(IEnumerablelt;SquadOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)
public class AlliancePositionConverter : IPositionConverter { public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;AllianceOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) { return allianceOpenPositions.Where(w =gt; w.AllianceId == allianceId) .Select(s =gt; new Position(orgOpenPositionList.FirstOrDefault(wh =gt; wh.Id == s.OpenPositionId)) { Id = s.Id.ToString(), AgileRole = s.LeadRole.Name, AgileRoleRank=s.LeadRole.Rank }).ToList(); }
и все остальные классы имеют аналогичную структуру.
и затем измените в каждом объекте параметр на унаследованную модель. К сожалению, это дает и ошибку.
Какое — либо возможное решение, кроме создания всех трех и реализации только одного необходимого?
Комментарии:
1. Какое сообщение об ошибке оно вам выдает? Также было бы неплохо посмотреть, для чего вы написали
OpenPositionBase
2. Сообщение об ошибке в этом случае заключается в том, что объект не реализует интерфейс.
3. В этом вопросе отсутствуют некоторые довольно важные детали. Можете ли вы вставить конкретные классы, базовый класс/интерфейс и объяснить, что делает этот метод и какие сходства есть у классов.
4. Спасибо за комментарий. Обновлено описание
Ответ №1:
не совсем уверен, чего именно ты добиваешься, но:
Вы можете сделать сам метод универсальным:
public IEnumerablelt;Positiongt; GetOpenPoslt;Tgt;(IEnumerablelt;Tgt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) where T : OpenPositionBase
Затем вы можете работать со своим списком, как если бы это была база открытых позиций
или вы можете создать универсальный интерфейс:
public interface IGetOpenPoslt;Tgt; where T : OpenPositionBase { public IEnumerablelt;Positiongt; GetOpenPos(IEnumerablelt;Tgt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList); } public class AlianceOpenPosition : OpenPositionBase, IGetOpenPoslt;AlianceOpenPositiongt; { public IEnumerablelt;Positiongt; GetOpenPos(IEnumerablelt;AlianceOpenPositiongt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) { // implement } }