Я рефакторинг некоторого кода и хочу, чтобы классы немного выше в цепочке наследования были немного более строгими с их параметрами.Поскольку я не уверен, что объясняю это правильно, вот что я получил:
public interface ISvdPredictor
{
List<string> Users { get; set; }
List<string> Artists { get; set; }
float PredictRating(ISvdModel model, string user, string artist);
float PredictRating(ISvdModel model, int userIndex, int artistIndex);
}
ISvdPredictor
использует ISvdModel
:
public interface ISvdModel
{
float[,] UserFeatures { get; set; }
float[,] ArtistFeatures { get; set; }
}
Теперь я хочуреализовать другой вариант:
public interface IBiasSvdPredictor : ISvdPredictor
{
float PredictRating(IBiasSvdModel model, string user, string artist);
float PredictRating(IBiasSvdModel model, int userIndex, int artistIndex);
}
, использующий IBiasSvdModel
, производный от ISvdModel
:
public interface IBiasSvdModel : ISvdModel
{
float GlobalAverage { get; set; }
float[] UserBias { get; set; }
float[] ArtistBias { get; set; }
}
IBiasSvdPredictor
не будет работать с ISvdModel
.
Проблема в том, что когда я реализую IBiasSvdPredictor
, мне придется реализовать 2 пары методов PredictRating.Один из ISvdPredictor
, а другой из IBiasSvdPredictor
.Что мне нужно сделать, чтобы иметь возможность просто реализовать те из IBiasSvdPredictor
?
Я также попробовал дженерики, но не смог ограничить PredictRating
для BiasSvdPredictor
до IBiasSvdModel
, используядиректива where
.Возможно, я все делаю неправильно, поэтому любое предложение может помочь.Я думаю, вы понимаете, что я пытаюсь сделать.
РЕДАКТИРОВАТЬ: Если кому-то нужно больше контекста, см. https://github.com/gligoran/RecommendationSystem. Я пишу этот код для моей диссертации для бакалавра.