Как переопределить параметр, определенный в методе интерфейса с более богатым типом?
У меня есть такие:
public class TennisPlayer
{
}
public class RogerFederer : TennisPlayer
{
}
public class RafaelNadal : TennisPlayer
{
}
А потом у меня есть несколько классов с методами, как эти:
public abstract class Manager
{
protected abstract void ScheduleFriendlies(TennisPlayer player);
}
public class RafaelNadalManager : Manager
{
public void ScheduleFriendlies(RafaelNadal rn)
{
//throw new NotClayException();
}
}
public class RogerFedererManager : Manager
{
public void ScheduleFriendlies(RogerFederer rf)
{
//throw new NotGrassException();
}
}
//'RafaelNadalManager' does not implement inherited abstract member 'Manager.ScheduleFriendlies(TennisPlayer)'
Я пытаюсь добиться того, чтобы у меня были детские классы Manager
но каждый такой класс будет привязан к одному игроку и, следовательно, к методам в этих дочерних классах (Manager
классы) будут характерны для этого игрока. Другими словами Roger
должен иметь свой собственный ScheduleFriendlies
в то время как Rafael
должен иметь свое.
Как мне это сделать? Альтернативные проекты подойдут, но имейте в виду:
Что я могу изменить: наследство, его маршруты и т. Д.
Но не можете позволить себе роскошь: снять детские классы менеджера и слиться в один (другими словами, мне нужно RogerFederer
а также RogerFedererManager
как отдельные классы).
Я попробовал это:
public abstract class Manager
{
protected abstract bool ScheduleFriendlies<T>(T player) where T : TennisPlayer;
}
public class RafaelNadalManager : Manager
{
protected override bool ScheduleFriendlies<T>(T player)
{
//but how do I enforce the caller that only RafaelNadal object can be
//passed to this but not RogerFederer?
}
}
1 ответ
Вы были близки, но вам нужен класс generic, а не только метод:
public abstract class Manager<T> where T : TennisPlayer
{
protected abstract bool ScheduleFriendlies(T player);
}
Затем вы можете использовать:
public class RafaelNadalManager : Manager<RafaelNadal>
{
protected override bool ScheduleFriendlies(RafaelNadal player)
{}
}