2014-09-10 38 views
0

我剛剛開始使用Swift,並且進入了課堂。如果我想要一個名爲「Team」的超級類和一個名爲「Player」的「Team」的子類。Swift的超級初始問題

我的想法是創建一個團隊和一個玩家,然後將玩家添加到teamPlayers Array。但是當我創建我的球員時,我必須重新創建球隊名稱。沒有辦法覆蓋Player類的init方法?

類(球員是球隊的一個子類): - 團隊 - 玩家

import UIKit 

class Team { 
    var teamName: String 
    var teamPlayers:[Player] = [] 

    init(aName: String){ 
     self.teamName = aName 
    } 

    // methods 

    func addPlayer(aPlayer: Player){ 
     teamPlayers.append(aPlayer) 
    } 

} 

class Player: Team { 
    var playerName: String 
    var playerNumber: Int 

    init(aName: String, aNumber: Int){ 
     self.playerName = aName 
     self.playerNumber = aNumber 
     super.init(aName: "Barcelona") 
    } 
} 

var myTeam: Team = Team(aName: "Barcelona") 
var lionelMessi: Player = Player(aName: "Lionel Messi", aNumber: 10) 
myTeam.addPlayer(lionelMessi) 

更新:

讓更多喜歡這個意義上說,這就是我努力實現:

import UIKit 

class Team { 
    var teamName: String 
    var teamPlayers:[Player] = [] 

    init(aName: String){ 
     self.teamName = aName 
    } 

    // methods 
    func addPlayer(aPlayer: Player){ 
     teamPlayers.append(aPlayer) 
    } 

    func returnCount() -> Int { 
     return self.teamPlayers.count 
    } 
} 

class Player: Team { 
    var playerName: String 
    var playerNumber: Int 

    init(aName: String, aNumber: Int, aTeam: String){ 

     self.playerName = aName 
     self.playerNumber = aNumber 
     super.init(aName: aTeam) 
    } 
} 

var myTeam: Team = Team(aName: "Barcelona") 
var lionelMessi: Player = Player(aName: "Lionel Messi", aNumber: 10, aTeam: myTeam.teamName) 
myTeam.addPlayer(lionelMessi) 
var daniAlvez: Player = Player(aName: "Dani Alvez", aNumber: 2, aTeam: myTeam.teamName) 
myTeam.addPlayer(daniAlvez) 
myTeam.returnCount() 
+2

無論如何,爲什麼'Player'是Team'的一個子類呢?這似乎沒有太大意義。總之,你在做什麼* *是重寫構造... – sapi 2014-09-10 23:26:05

+0

沒關係, 修正了這一點: '類球員:球隊{VAR playerName:字符串 VAR playerNumber:詮釋 的init(aName:串,aNumber的:中等,ATEAM:串){ self.playerName = aName self.playerNumber = aNumber的 super.init(aName:ATEAM) } } VAR myTeam:團隊=小組(aName:「巴塞羅那「) var lionelMessi:Player = Player(aName:」Lionel Mess我「,a編號:10,aTeam:myTeam.teamName) myTeam.addPlayer(lionelMessi)' – outime 2014-09-10 23:29:16

+0

@sapi你會怎麼做? – outime 2014-09-10 23:30:59

回答

0

我在添加這個答案是因爲海報詢問了一個更簡潔的方法來實現他的目標。

@ user2321906,這消除了對兩個類之間的繼承的需要,可能會多一點自然的使用方法:

class Team { 
    var teamName: String 

    // strong reference to a Player 
    // uses a Dictionary so a number can only have one player 
    var teamPlayers:[Int: Player] = [Int: Player]() 

    init(name: String){ 
    self.teamName = name 
    } 

    // Now it not only adds the player, it also sets the team and the number. 
    func addPlayer(player: Player, number: Int){ 
    player.playerNumber = number 
    player.team = self 
    teamPlayers[number] = player 
    } 

    func returnCount() -> Int { 
    return self.teamPlayers.count 
    } 
} 

class Player { 
    var playerName: String 
    var playerNumber: Int? 
    var team: Team? // weak reference to a Team 

    init(name: String){ 
    self.playerName = name 
    } 
} 

let myTeam: Team = Team(name: "Barcelona") 
let lionelMessi: Player = Player(name: "Lionel Messi") 
myTeam.addPlayer(lionelMessi, number: 10) 
let daniAlvez: Player = Player(name: "Dani Alvez") 
myTeam.addPlayer(daniAlvez, number: 2) 
myTeam.returnCount()  // -> 2 

lionelMessi.team!.teamName // -> "Barcelona" 

現在玩家被分配一個號碼,球隊在小組對象添加它。這兩個類之間沒有繼承關係,這是沒有意義的,因爲繼承是具有「是-α」關係的類。玩家不是一種團隊,而是一個團隊有一個玩家,所以它是一個「有一個」的關係。

另一件事是我通過讓團隊持有對玩家的強烈引用來阻止循環引用,但玩家對團隊持有較弱的引用。我將團隊作爲參考存儲在播放器中,以便如果團隊中的數據發生更改,它將自動反映到播放器中,並避免重複數據。

+0

非常感謝。你說的方式更有意義。 – outime 2014-09-11 17:45:49

3

您不應該從Team繼承Player。一個球員成爲球隊的一個子類是沒有意義的。這意味着玩家是更具體的團隊類型。您可以修剪您的播放器類到這一點:

class Player { 
    var playerName: String 
    var playerNumber: Int 

    init(aName: String, aNumber: Int){ 
     self.playerName = aName 
     self.playerNumber = aNumber 
    } 
} 

球隊和球員仍然有一個組合關係,其中一隊玩家含有一定數量的其他信息。