2015-08-21 20 views
9

Bu yüzden projemde özel bir desen düşünüyordum, ancak işe yaramayacağım. Ana fikir, alt sınıflara özgü arayüze erişmek için her alt sınıfta typealias'u değiştirmektir.Swift: Alt sınıf içerisindeki typealias'ı geçersiz kılıyor

protocol InstanceInterface: class { 

    typealias Interface 

    var interface: Interface { get } 
} 

// Baseclass 
protocol FirstClassInterface: class { /* nothing here for the example */ } 

class FirstClass: InstanceInterface, FirstClassInterface { 

    typealias Interface = FirstClassInterface 

    var interface: Interface { return self } 
} 

// Subclass 
protocol SecondClassInterface: FirstClassInterface { 

    func foo() 
} 

class SecondClass: FirstClass, SecondClassInterface { 

    typealias Interface = SecondClassInterface // <--- This does nothing :(

    func foo() { print("hello world") } // Swift 2.0 here 
} 

// Lets say I want to call foo trough the interface 
let test = SecondClass() 

test.interface.foo() // 'Interface' does not have a member named 'foo' 

şey yapıyorum yanlış veya bazı Swift kavramlar burada yanlış mı var ?! Burada süper sınıf protokollerinden herşeyi tekrar tekrar uygulamak için alt sınıflara ihtiyacım var. Benim küçük desenim bile mümkün mü? Herhangi bir yardım için minnettar olurum. :)

cevap

6

Bu sorun için iyi bir çözüm yok.

typealias aşağıdaki bu durumda işe ama dikkate alacağını geçersiz kılmak için ana fikri:

protocol TakeAndGet { 
    typealias T 
    func take(value: T) 
    func get() -> T 
} 

class FirstClass: TakeAndGet { 
    typealias T = FirstClass 

    var property = 0 

    func take(value: T) { 
     value.property = 4 
    } 

    func get() -> T { 
     return FirstClass() 
    } 
} 

class SecondClass: FirstClass { 

    typealias T = SecondClass 

    var property2 = "hello" 
} 

SecondClass ait typealiastake yöntemi onun bu yana çalışacak diğeri geçersiz kılarsa hangi can Alt sınıf alır Üst sınıf olarak ele alınmalıdır. Ancak get yöntemi, FirstClass örtüsünü SecondClass'a dönüştüremez. Bu nedenle, typealias'u geçersiz kılmak mümkün değildir.

get() -> SecondClass ile get işlevini geçersiz kılmak istiyorsak, süper sınıftakiyle aynı imzası olmadığı için işe yaramaz.

SecondClass().get() // which type gets returned? SecondClass or FirstClass 

Yani farklı bir yaklaşım denemek zorunda: ek olarak belirsiz bir kullanımda sonuçlanır get yöntemini devralır.

+1

Şimdi noktayı görüyorum. Ama alt sınıftaki typealias'ı geçersiz kılarsanız hala bir hata veya uyarı olmalı! Demek istediğim, hiçbir şey yapmıyor, örneğiniz için bile, yine de SecondClass içindeki FirstClass'a sadık kalacak mıyım yoksa yine yanlış mıyım? Tipik suşları geçersiz kılma noktası nedir? – DevAndArtist

+1

@DevAndArtist Konu, bir "typealias" ın geçersiz kılınamayacağı ve "SecondClass" gibi aynı ada sahip yeni bir tane ilan ederseniz diğerini gölgelemesidir. Bu, 'T' nin SecondClass'ın farklı bir türü kapsamında olduğunu, ancak 'FirstClass'ın' T'sini değiştirmediğini gösterir. – Qbyte

İlgili konular