2015-03-05 18 views
7

tôi có mã này:phương pháp lớp cha trở về kiểu phân lớp trong nhanh chóng

class Dark: NSObject { 
    class var className: String { 
    return NSStringFromClass(self)!.componentsSeparatedByString(".").last! 
    } 

    var success = 0 

    class func devour<T: Dark>(params: Int) -> T { 
    var s = T() 
    return assign(s, params: params) 
    } 

    class func assign<T: Dark>(item: T, params: Int) -> T{ 
    if item.dynamicType === self { 
     item.success = params 
    } 
    return item 
    } 
} 

class Black: Dark { 
} 

class Violet: Dark { 
} 

Black.className // returns "Black" 
Violet.className // returns "Violet" 

Vấn đề xảy ra khi tôi làm điều này:

var ret = Black.devour(5) 
ret.success //returns 0 which I expect to be 5 

ret.self // returns {Dark success 0} which I expect to be {Black success 0} 

Vấn đề ở đây là khi phân lớp sử dụng phương pháp di truyền nuốt, nó trả về một đối tượng thuộc loại Dark. Tôi muốn có thể trả về kiểu phân lớp và không phải kiểu siêu lớp khi gọi devour. Ví dụ khi tôi làm:

var ret = Black.devour(5) 

Lớp của ret nên có lớp Black và không thuộc về lớp Dark.

Tôi hy vọng ai đó có thể giúp tôi về vấn đề này. Im thực sự ra khỏi ý tưởng. Cảm ơn! Tôi muốn tránh chaining và tôi coi đó là phương sách cuối cùng.

+0

Chính xác thì vấn đề của bạn là gì? Vui lòng ghi nhật ký lỗi. –

+0

Xem http://stackoverflow.com/questions/26296938/returning-a-subclass-from-its-base-class-in-swift –

+0

hi @RobinEllerkmann: Vấn đề ở đây là khi phân lớp sử dụng phương pháp Devour thừa hưởng, nó trả về một đối tượng kiểu Dark. Tôi muốn để có thể trả về kiểu phân lớp và không phải là kiểu lớp cha khi gọi Devour – oregon

Trả lời

7

Hóa ra tôi đã có thể làm một công việc xung quanh; Nhờ câu trả lời cho câu hỏi này: Cast to typeof(self).

Tất cả tôi cần làm là tạo ra một phương pháp mà trả về một đối tượng kiểu tự.

trước tiên, tôi đã tạo một lớp tạo ra một thể hiện của lớp cơ sở và trả về nó như là một thể hiện của AnyObject.

class func createDark() -> AnyObject { 
      var black = Black() 
      return black 
    } 

Khi tôi trở về một thể hiện của Black nó tự động phôi nó vào AnyObject vì nó là kiểu trả theo quy định của phương pháp này (Tôi thành thật chỉ figured này ra và điều này đã cứu tôi).

Sau đó, tôi đã tạo ra một phương pháp helper mà các cuộc gọi createDark() và gán thuộc tính/thuộc tính đến dụ:

class func prepare<T: Dark>(params: Int) -> T{ 
     var dark = createDark() as T 
     dark.assign(params) 
     return dark 
    } 

tôi đã sử dụng loại chung chung mà là của Dark loại hoặc lớp con của nó như là một kiểu trả về.

Sau đó, tôi đã làm điều này:

class func devour(params: Int) -> Self { 
     return prepare(params) 
    } 

bằng cách xác định Self như kiểu trả về, Nó tự động phôi nó để gõ tự mà có thể là của Dark loại hoặc bất kỳ lớp được thừa kế nó.

mã cuối cùng của tôi trông như thế này:

class Dark: NSObject { 
    var success = 0 

    func assign(params: Int) { 
     if self.dynamicType === self { // I dont really have to do this anymore 
      self.success = params 
     } 
    } 

    class var className: String { 
     return NSStringFromClass(self)!.componentsSeparatedByString(".").last! 
    } 

    class func createDark() -> AnyObject { 
     var black = Black() 
     return black 
    } 

    class func prepare<T: Dark>(params: Int) -> T { 
     var dark = createDark() as T 
     dark.assign(params) 
     return dark 
    } 

    class func devour(params: Int) -> Self { 
     return prepare(params) 
    } 


} 

để kiểm tra xem nó đã giải quyết được vấn đề:

var ret = Black.devour(5) 
ret.success //now returns 5 as expected 

ret.self // now returns {Black success 0} as expected 

công trình như mong đợi!

+2

điểm nếu bạn phải viết Đen() một cách rõ ràng trong lớp cha của bạn là gì?Nếu tôi muốn làm điều tương tự với Violet, hoặc một số lớp con tương lai chưa tồn tại? –

Các vấn đề liên quan