协议子类实现

时间:2015-03-23 01:09:13

标签: swift inheritance abstract-class abstract

我有以下代码,我试图强制抽象(抽象类/一致性):

PlayerProtocol:

protocol PlayerProtocol {
    func play();
    func stop();
    func pause();

    func getVolume() -> UInt32;
    func setVolume(level: UInt32);

    func isPaused() -> Bool;
    func isStopped() -> Bool;

    func onSessionResume();
    func onSessionInterupt();
}

BasicPlayer:

class BasicPlayer : PlayerProtocol {
    //some variables here..

    init() {
       //init some variables here..
    }

    func play() {
        fatalError("play() - pure virtual function called.");
    }

    func stop() {
        fatalError("stop() - pure virtual function called.");
    }

    func pause() {
        fatalError("stop() - pure virtual function called.");
    }

    func getVolume() -> UInt32 {
        fatalError("getVolume() - pure virtual function called.");
    }

    func setVolume(level: UInt32) {
        fatalError("setVolume() - pure virtual function called.");
    }

    func isPaused() -> Bool {
        fatalError("isPaused() - pure virtual function called.");
    }

    func isStopped() -> Bool {
        fatalError("isStopped() - pure virtual function called.");
    }

    func onSessionInterupt() {
        fatalError("onSessionInterupt() - pure virtual function called.");
    }

    func onSessionResume() {
        fatalError("onSessionResume() - pure virtual function called.");
    }
}

AudioPlayer:

class AudioPlayer : BasicPlayer, PlayerProtocol {
    private var device: COpaquePointer = nil;
    private var context: COpaquePointer = nil;
    private var source: ALuint = 0;
    private var buffer: ALuint = 0;
    private var interrupted: Bool = false;
    private var volume: Float = 50;


    override init() {
        super.init();
        //..
    }

    deinit {
        //..
    }

    override func play() {
        //..
    }

    override func stop() {
        //..
    }

    override func pause() {
        //..
    }

    override func setVolume(volume: UInt32) {
        //..
    }

    override func getVolume() -> UInt32 {
        //..
    }

    func isPlaying() -> Bool {
        //..
    }

    override func isPaused() -> Bool {
        //..
    }

    override func isStopped() -> Bool {
        //..
    }

    func isAudioPlaying() -> Bool {
        return AVAudioSession.sharedInstance().otherAudioPlaying;
    }

    override func onSessionInterupt() {
        self.pause();
    }

    override func onSessionResume() {
        self.play();
    }

    func setData(buffer: ALuint, source: ALuint) {
        self.buffer = buffer;
        self.source = source;
    }
}

但即使我指定AudioPlayer实现PlayerProtocol,它也不会强迫我实现所有成员函数,如playstop等。我可以删除它们,它不会抱怨。这可能是因为超类实现了它,但我无法弄清楚如何在超类中实现它并且允许派生类代替它实现。

基本上,BasicPlayer应该是抽象的,任何继承它的类都必须实现“某些”成员(不是全部)。 OnSessionInterrupt未在派生类中实现。我需要它来解决错误。

我该怎么做?如何在编译时将其导出到派生类中未实现的成员而不是抽象类?

1 个答案:

答案 0 :(得分:2)

AudioPlayer是已符合PlayerProtocol的类的子类。因为您已经实现了超类中的所有方法,所以这些实现在您的子类中可用,因此您没有义务重新声明它们。

在我看来,您在概念上以两种不同的方式抽象您的界面:通过协议和抽象超类。这可能是多余的?其中一个应该能够达到你的目的。