2016-06-08 64 views
1

我已經重新定義了繼承類中的>運算符,但系統仍然調用父類的>。這裏是我的父母 類:Swift運算符和繼承

class GenericModelClass : NSObject { 
    var subElementArray = [GenericModelClass]() 
    func orderSubElements() { 
     self.subElementArray.sortInPlace({return $0 > $1}) 
    } 
} 
func > (lhs: GenericModelClass, rhs: GenericModelClass) -> Bool { 
    print ("Use my > function on GenericModelClass (real class is \(lhs.dynamicType))") 
    return lhs.uniqueID() > rhs.uniqueID() 
} 

這裏是繼承類:

class Chapter: GenericModelClass { 
} 
func > (lhs: Chapter, rhs: Chapter) -> Bool { 
    print("Use my > operator on chapter") 
    return lhs.number > rhs.number 
} 

但是當我打電話與在subElementArray中,>被稱爲章對象orderSubElements功能是從GenericModelClass一。因此,在日誌中我有:

用我的>功能上GenericModelClass(實類是章)

你有一個想法,我怎麼能拿orderSubElements使用正確的操作?如果我在subElementArray數組中有章節,我想調用>章節

+1

請注意,對於Comparable協議,您應該實現'<'和'=='。所有其他關係運算符(如'>')則由標準庫提供。 –

回答

2

運算符不是動態分派的。編譯器使用呼叫站點提供的信息挑選>的實現。

您可以通過在GenericModelClass定義一個方法做比較

class GenericModelClass 
{ 
    // ... other stuff ... 

    func isGreaterThan(other: GenericModelClass) -> Bool 
    { 
     return self.uniqueID() > other.uniqueID() 
    } 
} 

和壓倒一切的是在第二章解決這個

class Chapter 
{ 
    // ... other stuff ... 

    override func isGreaterThan(other: GenericModelClass) -> Bool 
    { 
     guard let otherChapter = other as? Chapter 
     else 
     { 
      return super.isGreaterThan(other) 
     } 
     return self.number > other.number 
    } 
} 

操作變得

func > (lhs: GenericModelClass, rhs: GenericModelClass) -> Bool 
{ 
    return lhs.isGreaterThan(rhs) 
} 

的答案問如問,但有一點設計氣味跡象因爲需要檢查和轉換參數的類型,這就是說你要在一個數組中混合兩個比較概念並對其進行排序。你的模型可能需要更復雜一點,即。對象的排序概念需要了解不同種類的對象並相應地進行排序。例如在序言之後但在索引之前放置所有章節。