2013-10-22 124 views
1

我試圖將屬性添加到UIBezierPath。所以我創建了一個名爲JWBezierPath的子類。我想都還與數參數類方法速記,所以我創建的方法:返回父類對象的Objective-C類方法

+ (JWBezierPath *)bezierPathWithColor:(UIColor *)color { 
    JWBezierPath *path = [self bezierPath]; 
    [path setColor:color]; 
    return path; 
} 

的問題是,[self bezierPath]不會返回的UIBezierPath而不是我的子類的實例。我也試過用混凝土類:[JWBezierPath bezierPath]

我該如何解決這個問題?

+0

你能告訴我你的.h文件嗎 – cromanelli

+0

你想添加到'UIBezierPath'的什麼樣的屬性? –

回答

1

如果你沒有在你的類中實現+bezierPath方法,那麼超類的實現將被調用,它將創建UIBezierPath的實例,而不是JWBezierPath。

理論上,基類中的工廠方法可以創建實例,即使這些方法不會被覆蓋,例如,考慮工廠方法2個選項的BaseClass:

// Will create instance of child class even if method won't be overriden 
+ (instancetype) someObject { 
    return [self new]; 
} 

VS

// Will always create instance of base class 
+ (BaseClass*) someObject { 
    return [BaseClass new]; 
} 

但是考慮+bezierPath聲明(+(UIBezierPath *)bezierPath)和你的證據UIBezierPath類未實現這種方式,你必須實現+bezierPath方法在你的幼崽班

+0

查看我對Arkadiusz Holkos的評論回答 –

1

bezierPath被定義爲:

+ (UIBezierPath *)bezierPath 

,所以你可能要使用:

JWBezierPath *path = [[self alloc] init]; 

代替。

+0

然後我必須得到'UIBezierPath'的源代碼。因爲我不知道在諸如'bezierPathForRect:'等方法中發生了什麼。 –

+0

@Julian:Apple將類方法的返回類型聲明爲'(UIBezierPath *)',因爲它們可能不希望任何人重寫它們。但是,您應該可以使用實例方法來模擬它們,例如:'addCurveToPoint:controlPoint1:controlPoint2:'等等。您還沒有說過要添加哪種屬性。也許有比從UIBezierPath繼承的更好的方法。 –

+0

我想添加一個'color'參數(就像我的示例方法所示)。我也可以創建一個類別並使用運行時... –