Как переопределить параметр, определенный в методе интерфейса с более богатым типом?

У меня есть такие:

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)
     {}
}
Другие вопросы по тегам