我可以在子类中实现协议的一个功能吗?
May I implement one function of protocol in subclass?
我刚刚修改了它。另一个问题是,如果我想让一个子类继承自BaseParticipant,我可以在子类内部重新实现func performEvent
吗?
例如:
class CyclingParticipant: BaseParticipant, Participant
{
init(name: String)
{
super.init(name: name, preferredEvent: Event.CYCLING)
}
func performEvent(event: Event, distance: Distance) throws
{
}
}
但是编译器说“CyclingParticipant 与协议 Participant 的冗余一致性。
class BaseParticipant: Participant
{
var name: String
var preferredEvent: Event
var raceTime: Int
var couldNotFinish: Bool
//var performedEvent: Event
// in swift, the class accepts protocol must impletment all funcs inside protocol
init(name: String, preferredEvent: Event)
{
self.name = name
self.preferredEvent = preferredEvent
self.raceTime = 0
self.couldNotFinish = false
}
func getName() -> String
{
return self.name
}
func getPreferredEvent() -> Event
{
return self.preferredEvent
}
func isDisqualified() -> Bool
{
return self.couldNotFinish
}
func addTime(addtionalRaceTime:Int) -> Void
{
self.raceTime += addtionalRaceTime
}
func setCouldNotFinish() -> Void
{
self.couldNotFinish = true
}
func performEvent(event: Event, distance: Distance) throws -> Int
{
return 1
}
func getTime() throws
{
}
}
协议参与者代码:
protocol Participant
{
func getName() -> String
func getPreferredEvent() -> Event
func isDisqualified() -> Bool
func performEvent(event: Event,distance: Distance) throws ->Int
func addTime(addtionalRaceTime: Int)
func setCouldNotFinish()
func getTime() throws
}
您缺少协议中列出的 getTime()
函数的实现。另外,你应该 post Piazza 上这样的问题。 :P
[更新以回答改写后的问题]
BaseParticipant
class已经采用了Participant
协议,所以CyclingParticipant
子class不应该声明自己也采用了,这是导致冗余一致性错误。因为 BaseParticipant
已经是 Participant
,所以 BaseParticipant
的任何子 class 也将是 Participant
.
变化:
class CyclingParticipant: BaseParticipant, Participant
至:
class CyclingParticipant: BaseParticipant
默认情况下,Swift 协议中声明的所有方法都是必需的。
getTime()
未实现
我刚刚修改了它。另一个问题是,如果我想让一个子类继承自BaseParticipant,我可以在子类内部重新实现func performEvent
吗?
例如:
class CyclingParticipant: BaseParticipant, Participant
{
init(name: String)
{
super.init(name: name, preferredEvent: Event.CYCLING)
}
func performEvent(event: Event, distance: Distance) throws
{
}
}
但是编译器说“CyclingParticipant 与协议 Participant 的冗余一致性。
class BaseParticipant: Participant
{
var name: String
var preferredEvent: Event
var raceTime: Int
var couldNotFinish: Bool
//var performedEvent: Event
// in swift, the class accepts protocol must impletment all funcs inside protocol
init(name: String, preferredEvent: Event)
{
self.name = name
self.preferredEvent = preferredEvent
self.raceTime = 0
self.couldNotFinish = false
}
func getName() -> String
{
return self.name
}
func getPreferredEvent() -> Event
{
return self.preferredEvent
}
func isDisqualified() -> Bool
{
return self.couldNotFinish
}
func addTime(addtionalRaceTime:Int) -> Void
{
self.raceTime += addtionalRaceTime
}
func setCouldNotFinish() -> Void
{
self.couldNotFinish = true
}
func performEvent(event: Event, distance: Distance) throws -> Int
{
return 1
}
func getTime() throws
{
}
}
协议参与者代码:
protocol Participant
{
func getName() -> String
func getPreferredEvent() -> Event
func isDisqualified() -> Bool
func performEvent(event: Event,distance: Distance) throws ->Int
func addTime(addtionalRaceTime: Int)
func setCouldNotFinish()
func getTime() throws
}
您缺少协议中列出的 getTime()
函数的实现。另外,你应该 post Piazza 上这样的问题。 :P
[更新以回答改写后的问题]
BaseParticipant
class已经采用了Participant
协议,所以CyclingParticipant
子class不应该声明自己也采用了,这是导致冗余一致性错误。因为 BaseParticipant
已经是 Participant
,所以 BaseParticipant
的任何子 class 也将是 Participant
.
变化:
class CyclingParticipant: BaseParticipant, Participant
至:
class CyclingParticipant: BaseParticipant
默认情况下,Swift 协议中声明的所有方法都是必需的。
getTime()
未实现