2013-10-08 74 views
2

我正在教自己的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; } 
} 

然后实例的阶级作为阶级:

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" }; 
    } 

如何确保团队tacoTeam从球员塔科继承和团队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; } 

} 

然后我可以创建类的实例,并得到什么了出来这样:

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(); 
    } 

这似乎做的帮助在我的代码中的数据模型,使之更容易得到它进出数据库的我正在去使用这个应用程序一个相当体面的工作。

+2

继承不涉及具体的对象实例。您提供的示例没有意义,这些类不应该彼此继承。此外,联盟是直截了当的滑稽。 – Michael

+0

我认为你完全误解了继承是什么...... –

回答

8

类继承意味着一个“是-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>(); 
    } 
} 

现在,以确保塔克属于球队塔克,你加他的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); 
} 
+0

+1 *合成* – Habib

+1

+1 ...另外我会说队伍“包含”球员而不是“组成”......但[合成]( http://en.wikipedia.org/wiki/Object_composition)可能是更好的词(假设团队“拥有”玩家,并且没有其他集合拥有它们,如“AllPlayersInTheCountry”) –

+0

谢谢大家对此的意见。我不理解继承是如何工作的。我想我明白如何完成我现在的工作。 – Utegrad

1

这种说法很奇怪,至少可以说:

如何确保团队tacoTeam继承玩家taco和团队peteTeam继承自玩家pete?

事实上,继承不一定与您创建的对象有任何关系。团队从Player继承......就是这样。

我有点困惑,在此提出从哪里来的,但我想指出的是,这种继承是奇数:

class Team : Player 

我看不出一个团队将继承一个球员。你确定你应该继承吗?

想想这样。正如其他人指出的那样,继承意味着一种“是”的关系。说球队是球员并没有任何意义,说球员是球队也没有意义。 A队是组成的球员。这并不意味着应该有任何继承。

0

你在这个例子中滥用继承。考虑一个形状的简单例子。

class Shape 
{ 
    Color Color { get; set; } 
} 

class Rectangle : Shape 
{ 
    double SideA { get; set; } 
    double SideB { get; set; } 
} 

class Square : Rectangle 
{ 
} 

您可以看到Square是矩形,矩形是Square。所有三个都有一个颜色。矩形有两组相等的边。 Square还有其他一些更具体的属性。

你的结构应该遵循的东西沿着这些线路更多:

class League 
{ 
    public Team[] Teams { get; set; } 
} 

class Team 
{ 
    public League League { get; set; } 
    public Player[] Players { get; set; } 
} 

class Player 
{ 
    public Team Team { get; set; } 
} 
1

退一步,只是考虑如何在实际生活中。 A League具有一个或多个TeamTeam具有一个或多个Player。这就是你要如何组织你的类:

class League 
{ 
    public string name { get; set; } 
    public List<Team> Teams { get; set; } 
} 

class Team 
{ 
    public Guid TeamGuid { get; set; } 
    public string TeamName { get; set; } 
    public List<Player> Players { get; set; } 
} 

class Player 
{ 
    public Guid PlayerGuid { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

所以现在你可以做这样的事情:

var league = new League() 
{ 
    name = "AFC", 
    Teams = new List<Team>() 
}; 

var team = new Team() 
{ 
    TeamGuid = Guid.NewGuid(), 
    TeamName = "Chicago Bears", 
    Players = new List<Player>() 
} 
league.Teams.Add(team); 

var player = new Player() 
{ 
    PlayerGuid = Guid.NewGuid(), 
    FirstName = "Test", 
    LastName = "Player" 
}; 
team.Players.Add(player); 

但就这方面来说:

我如何确保团队tacoTeam从玩家taco继承,并且团队peteTeam从Player pete继承?

这不是继承的原因。继承是为了让您可以延长Player例如进入Linebacker

public class Linebacker : Player 
{ 
    public int Tackles { get; set; } 
} 

见,不每个Player具有Tackles的统计,但Linebacker会。你可以抽象出更多,但我只是想举一个例子。

0

我不确定你完全理解继承。在这种情况下,并不存在。

一个联盟将由一组球队组成,而一个球队将由一组球员组成。

class League 
{ 
    public string name { get; set; } 
    public List<Team> Teams { get; set; } 
} 

class Team 
{ 
    public Guid TeamGuid { get; set; } 
    public string TeamName { get; set; } 
    public List<Player> Players { get; set; } 
} 

class Player 
{ 
    public Guid PlayerGuid { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

如果你有不同类型的联赛,例如,一个棒球联盟和一个足球联盟,所以在这种情况下,他们将继承联盟以及其他属性,

class BaseballLeague : League 
{ 
    public string SomeOtherProperty { get; set; } 
}