2016-12-09 1 views
2

In Swift, mit der Verwendung der Erweiterung können Sie Methode Körper in "Protokoll" geben. in meinem Code bin ich in der Lage Methode Körper zu geben,Kann ich mehrfache Vererbung mit Protokoll in swift unterstützen?

protocol Test1{ 
    func display() 
} 
extension Test1{ 

    func display(){ 
     print("display Test1") 
    } 
} 

protocol Test2{ 
    func display() 
} 
extension Test2{ 

    func display(){ 
     print("display Test2") 
    } 
} 
class ViewController: UIViewController,Test1,Test2 { 

    var test1 : Test1? 
    var test2 : Test2? 

    func display() { 
     print("display") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     self.test1 = self 
     test1?.display() 

     self.test2 = self 
     test2?.display() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Ich weiß, dass ich geben test1 und Adresse des test2 Objekts in Viewcontroller Klasse. also "display" wird zweimal gedruckt. aber in beiden "Protokollen" kann ich diese Methoden anwenden.

also meine Frage ist, dass warum Apple mir Funktionalität geben, Methoden Körper in "Protokoll" schreiben?

Kann mir jemand helfen, diese Funktionalität zu verstehen?

Antwort

3

Obwohl die Frage alle einfach aussieht, erläutern die Aspekte des Protokolls Oriented Programming und die Bedeutung von Out wird mir ganze Blog drum herum machen schreiben :)

Wie dem auch sei, im Grunde Oriented Programming Protokoll ermöglicht Ihnen, die Mehrfachvererbung zu nutzen, welches Objekt orientierte Programmiersprachen wie Java, Objective-C werden nicht unterstützt, weil DiamondProblem

Nun aber Protocol Oriented Programming ermöglicht es Ihnen, die Fähigkeit /Funktionalität als Protokoll zu modellieren und nicht als Instanzmethode von Klassen (wie im Fall von Ziel C) wir müssen uns einig sein, dass wir alle die Vererbung genossen haben ays !!, Erinnern Sie sich daran, dass Sie eine Methode mit einer Operation deklariert haben und sie dann erweitern, was auch immer spezifisch für child ist, und trotzdem den gesamten Code in der übergeordneten Methode verwenden, indem Sie einfach super.methodname ??? Wie kann man es im Protokoll erreichen ??? Sie können den Code nicht erneut verwenden ??

So Protocols Standardimplementierungen sind die einfachen Möglichkeiten, den Klassen die Standardimplementierung bereitzustellen, die einfach das Protokoll erweitern und bestätigen möchten, es aber nicht stören, es zu ändern.

Beispiel: Angenommen, ich habe ein Protokoll, das meinen Familiennamen druckt, wenn die Elternklasse es bestätigt, wird es den gleichen Familiennamen wie ich drucken, wenn ich auch das gleiche Protokoll bestätige :) Richtig nach all seinem Familiennamen hat es gewonnen ändere nicht !!!

Nur weil Sie ein Protokoll bestätigen, müssen Sie seine Methodenimplementierung nicht bereitstellen, wenn das Protokoll bereits eine eigene Standardimplementierung hat. Sie werden Ihr eigenes bieten, wenn Sie etwas anderes als die Default-Implementierung zur Verfügung gestellt tun wollen :)

protocol Test { 
    func test1() 
} 

extension Test { 
    func test1() { 
     print("Yo man") 
    } 
} 

protocol Test2 { 
    func test2() 
} 

extension Test2 { 
    func test2() { 
     print("Bye man") 
    } 
} 

class ViewController: UIViewController,Test,Test2 { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.test1() 
     self.test2() 
    } 
} 

Wie man sehen kann ich keine Implementierung zur Verfügung gestellt haben, um Test1 oder test2 noch ich es verwenden, als ob seine bereits umgesetzt für ich :)

Das ist die Absicht der Standardimplementierung des Protokolls. Hoffe, es

Beobachtung hilft:

Sie haben zwei Protokolle, Test1 und Test2 beide gleiche Methode Display haben, jetzt sind Sie in die grundlegende Frage der DiamondProblem bekommen, wenn ich einfach Display() aufgerufen, die Umsetzung zu Anruf ?? Test1's oder Test2's ?? Swift löst es zur Kompilierzeit und sagt Ihnen, dass mehrdeutige Verwendung von display() beim Aufruf von self.display()

Der einzige Grund, dass es immer noch in ur-Code funktioniert, weil Sie zwei Variablen vom Typ test1 und test2 und erstellt haben Sie haben Methoden aufgerufen, die test1.display() und test2.display() verwenden. Das ist okay, keine Mehrdeutigkeit, aber das ist nicht so, wie Sie es benutzen wollen, nicht wahr?

Also im Grunde kann man nie

+0

wenn Protokoll-Test :) in Diamant-Problem mit Protokollen erhalten und Test2 hat gleiche Signaturverfahren „display()“ und rufen Sie wie self.display(), dann, welches Protokoll Verfahren werden heißen ? –

+1

warte ich schreibe die gleiche Sache in meine Bearbeitung :) –

+0

@ vikas-prajapati: Siehe meine aktualisierte Antwort :) –