4

私はこれらを持っています:

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が、そのようなクラスはすべて1人のプレーヤーに関連付けられるため、それらの子クラス(Managerクラス)のメソッドはそのプレーヤーに固有のものになります。言い換えれRogerば、彼自身を持つべきであるScheduleFriendlies一方で、彼自身をRafael持つべきです。

どうすればいいですか?別の設計でも構いませんが、次の点に注意してください。

私が変更できるもの:継承、そのルートなど

ただし、子マネージャー クラスを削除して 1 つにマージする余裕はありません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?
    }
}
4

1 に答える 1

9

あなたは近くにいましたが、メソッドだけでなくクラスジェネリックが必要です:

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)
     {}
}
于 2012-10-05T23:53:06.700 に答える