したがって、チームとプレーヤーの関係を次のように設計したいと思います。すべてのプレーヤーは1つのチームに属しますが、インターフェイスを使用して練習したかったので、ITeamとIAthleteを作成し、次にBasketballTeamとBasketballPlayerを作成しました。それから私はこのコードを書きました:
public interface IAthlete
{
string GetName();
string GetSport();
}
public interface ITeam
{
void AddPlayer(IAthlete player);
IAthlete[] GetAthletes();
string GetName();
int GetNumberOfPlayers();
}
public class BasketballPlayer:IAthlete
{
private string name;
public string GetName()
{
return this.name;
}
public string GetSport()
{
return "Basketball";
}
public BasketballPlayer(string name)
{
this.name = name;
}
public void Run(int distance)
{
Console.WriteLine(this.name + " just ran " + distance.ToString() + " meters.");
}
public bool Shoot()
{
Console.WriteLine("Successful shot for " + this.name);
return true;
}
}
public class BasketballTeam: ITeam
{
BasketballPlayer[] players;
int numberOfPlayers;
private string name;
public void AddPlayer(BasketballPlayer player)
{
this.players[this.numberOfPlayers] = player;
this.numberOfPlayers++;
}
public IAthlete[] GetAthletes()
{
return this.players;
}
public string GetName()
{
return this.name;
}
public int GetNumberOfPlayers()
{
return this.numberOfPlayers;
}
public BasketballTeam(string name)
{
this.numberOfPlayers = 0;
this.name = name;
this.players = new BasketballPlayer[10];
}
}
class Program
{
static void Main(string[] args)
{
BasketballTeam bt = new BasketballTeam("MyTeam");
BasketballPlayer bp = new BasketballPlayer("Bob");
bt.AddPlayer(bp);
foreach (BasketballPlayer player in bt.GetAthletes())
{
Console.WriteLine(player.GetName());
}
foreach (IAthlete a in bt.GetAthletes())
{
Console.WriteLine(a.GetName());
}
}
}
しかし、私はこれを使用しているため、コンパイルされません:
public void AddPlayer(BasketballPlayer player)
これの代わりにBasketballPlayerで
public void AddPlayer(IAthlete player)
BasketballPlayerはIAthleteなので、うまくいくはずだと思いました。そして、それをIAthleteに変更すると、次のような別のクラスを作成できます。
public class HockeyPlayer : IAthlete
{
private string name;
public string GetName()
{
return this.name;
}
public string GetSport()
{
return "Hockey";
}
public HockeyPlayer(string name)
{
this.name = name;
}
public void Run(int distance)
{
Console.WriteLine(this.name + " just ran " + distance.ToString() + " meters.");
}
}
そして、私のメインでこれを行います:
HockeyPlayer hp = new HockeyPlayer("Henry");
bt.AddPlayer(hp);
HockeyPlayerをBasketballTeamに追加しているので、これは論理的に間違っています。こんなはずなのに、そうしないように気をつければいいのでしょうか?私は何が間違っているのですか?クラス図を使用してこれを表示するにはどうすればよいですか?これは結合の緩みにつながりますか?