2013-10-08 73 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; } 
}