我正在努力教自己C#并且有一个关于从父对象的特定实例继承的问题.
例如,如果我这样定义我的类:
class League
{
public string name { get; set; }
}
class Player : League
{
public Guid PlayerGuid { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Team : Player
{
public Guid TeamGuid { get; set; }
public string TeamName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后实例化这样的类:
static void Main(string[] args)
{
League myLeague = new League() { name = "The League" };
Player taco = new Player() { PlayerGuid = Guid.NewGuid(), FirstName = "Taco", LastName = "MacArthur" };
Player pete = new Player() { PlayerGuid = Guid.NewGuid(), FirstName = "Pete", LastName = "Eckhart" };
Team tacoTeam = new Team() { TeamGuid = Guid.NewGuid(), TeamName = "Password is Taco" };
Team peteTeam = new Team() { TeamGuid = Guid.NewGuid(), TeamName = "3-Pete" };
}
Run Code Online (Sandbox Code Playgroud)
我如何确保Team tacoTeam继承自玩家taco和Team peteTeam继承自玩家皮特?
我的感觉是,我不理解如何正确地为这种情况定义类,并希望指出如何做到这一点.
为了澄清元素之间的关系我改变了"玩家"到"所有者"更好地代表了我的想法.我可以进一步为"玩家"添加一个类来代表真正的玩家而不是扶手椅玩家.
通过@neoistheone和@McGarnagle的输入,我能够修改它并定义了这样的类:
class League
{
public string name { get; set; }
}
class Owner
{
public Guid OwnerGuid { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Team
{
public Guid TeamGuid { get; set; }
public string TeamName { get; set; }
public Owner TeamOwner { get; set; }
public League League { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个类的实例,并从中获取它们的内容:
static void Main(string[] args)
{
League MyLeague = new League() { name = "The League" };
Owner taco = new Owner() { FirstName = "Taco", LastName = "MacArthur", OwnerGuid = Guid.NewGuid() };
Owner pete = new Owner() { FirstName = "Pete", LastName = "Eckhart", OwnerGuid = Guid.NewGuid() };
Team tacoTeam = new Team() { TeamGuid = Guid.NewGuid(), TeamName = "Password is Taco", League = MyLeague, TeamOwner = taco };
Team peteTeam = new Team() { TeamGuid = Guid.NewGuid(), TeamName = "3-Pete", League = MyLeague, TeamOwner = pete };
List<Team> Teams = new List<Team>();
Teams.Add(tacoTeam);
Teams.Add(peteTeam);
foreach(Team team in Teams){
Console.WriteLine("Team Name:\t{0}\nTeam Owner:\t{1}\nLeague Name:\t{2}\n-----",
team.TeamName, team.TeamOwner.FirstName + " " + team.TeamOwner.LastName, team.League.name);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
这似乎做了相当不错的工作,帮助我的代码中的数据建模,以便更容易进入和退出我正在努力使用此应用程序的数据库.
类继承意味着"is-a"关系.例如,你不希望玩家继承联盟,因为这意味着玩家是联盟.
相反,你想要的是作曲 - 联盟由球队组成,球队由球员组成.您通过创建类成员来表达组合.类Team应该有一个类的集合成员,Player依此类推.例如:
class Player
{
public Guid PlayerGuid { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Team
{
public Guid TeamGuid { get; set; }
public string TeamName { get; set; }
public IList<Player> Players { get; private set; }
public Team()
{
Players = new List<Player>();
}
}
class League
{
public string name { get; set; }
public IList<Team> Teams { get; private set; }
public League()
{
Teams = new List<Team>();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,为了确保Taco属于Team Taco,您可以将他添加到Team该类的相应实例中:
static void Main(string[] args)
{
Player taco = new Player { PlayerGuid = Guid.NewGuid(), FirstName = "Taco", LastName = "MacArthur" };
Player pete = new Player { PlayerGuid = Guid.NewGuid(), FirstName = "Pete", LastName = "Eckhart" };
Team tacoTeam = new Team { TeamGuid = Guid.NewGuid(), TeamName = "Password is Taco" };
Team peteTeam = new Team { TeamGuid = Guid.NewGuid(), TeamName = "3-Pete" };
tacoTeam.Players.Add(taco);
peteTeam.Players.Add(pete);
League myLeague = new League { name = "The League" };
myLeague.Teams.Add(tacoTeam);
myLeague.Teams.Add(peteTeam);
}
Run Code Online (Sandbox Code Playgroud)