Does ReSharper’s warning “SuggestBaseTypeForParameter” suggest design problems?

A water user can submit an Application for a water right with the hope of getting a Permit to use water, which might later become a BonaFideWaterRight. The right holder may apply to Transfer any of the above items (or others not listed for brevity) by changing ownership, moving it to new ground, splitting it in half and selling the remainder to another individual, etc…

The above-emboldened states of being for a water right (and other non-water-right things as well) have come to be known here as Processes. All of the above processes have lots of individual work items (sub-processes? But confusingly they’re still referred to as Processes) in common, but the only one we need concern ourselves with here is the PointOfDiversion.

I’m in the midst of an effort to refactor code that I inherited regarding these processes.

First the abstract parent classes I’ve created (omitting a fair amount of ISomethingProcess interfaces being inherited along the way) . . .

public abstract class WREditProcess : IWREditProcess { }  public abstract class WaterRightsProcess : WREditProcess  {      public IWaterRightLookupRepository QueryWaterRights { get; }     protected ILocationQueries LocationRepository { get; }      protected WaterRightsProcess(IWaterRightLookupRepository queryWaterRights, ILocationQueries locationRepository)     {         QueryWaterRights = queryWaterRights;         LocationRepository = locationRepository;     }     /* Work performed in virtual methods using those repositories */ }  public abstract class PointOfDiversionProcess : WaterRightsProcess, IPointOfDiversionProcess   {     protected IPODLocationRepository PODLocationRepository { get; }     protected IPointOfDiversionRepository PODRepository { get; }      protected PointOfDiversionProcess(IWaterRightLookupRepository queryWaterRights, IPODLocationRepository locationRepository, IPointOfDiversionRepository pointOfDiversionRepository)         : base(queryWaterRights, (ILocationQueries)locationRepository)     {         PODLocationRepository = locationRepository;         PODRepository = pointOfDiversionRepository;     }     /* Work performed in virtual methods using those repositories */ } 

There’s a large amount of concrete work done in those abstract classes using the repositories passed in from their child classes’ constructors. This continues to the concrete classes (the one for transfers shown here in its entirety) . . .

public class TransferPointOfDiversionProcess : PointOfDiversionProcess {     protected override ILog Log => LogManager.GetLogger(typeof(TransferPointOfDiversionProcess));      /// <summary>     /// Constructor for a TransferPointOfDiversionProcess     /// </summary>     /// <param name="baseWaterRightRepository">Repository for base water right information</param>     /// <param name="locationRepository">Repository that abstracts the locPODTransfer table (if such a thing existed, but instead it's a clump of XML)</param>     /// <param name="pointOfDiversionRepository">Repository that abstracts the PointOfDiversion table</param>     [SuppressMessage("ReSharper", "SuggestBaseTypeForParameter")]     public TransferPointOfDiversionProcess(ITransferRepository baseWaterRightRepository,         IPODLocationRepository locationRepository,         TransferPointOfDiversionRepository pointOfDiversionRepository)         : base(             baseWaterRightRepository,             locationRepository,             pointOfDiversionRepository)     {     }      /// <inheritdoc />     public override string DisplayName => "Transfer";      /// <inheritdoc />     public override string ConfigLayerID => "locPODWRTransfer";      /// <inheritdoc />     public override string Name => "locPODWRTransfer";      /// <inheritdoc />     public override string CorrelateProcessName => "Transfer"; } 

Note that the constructor for TransferPointOfDiversionProcess asks for a concrete TransferPointOfDiversionRepository class rather than the IPointOfDiversionRepository interface that its parent specifies. This is critical — especially for transfers because the TransferPointOfDiversionRepository overrides all sorts of things from its parent because transfers are stored in a wholly different way from everything else. For the same reason, I’m planning a similar TransferPointOfDiversionLocationRepository class to take the place of the IPODLocationRepository parameter as well but haven’t gotten there yet.

ReSharper tickles me with the “Parameter can be declared with base type” warning on this parameter, suggesting the IPointOfDiversionRepository type be used instead. I disabled this warning for each constructor, but now I can’t shake the feeling that I’m getting this warning because of design flaws–failing to abstract something away or something like that–but I can’t figure out what. Can anyone suggest improvements (or, even better, tell me not to put so much faith in ReSharper)?