让子对象继承自特定的父对象

Ute*_*rad 2 c# inheritance

我正在努力教自己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)

这似乎做了相当不错的工作,帮助我的代码中的数据建模,以便更容易进入和退出我正在努力使用此应用程序的数据库.

McG*_*gle 8

类继承意味着"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)