這不是一個好主意,作爲一種設計模式。順便說一下,在Java中是不可能的,因爲由於類型擦除,Comparable和Comparable是相同的二進制接口。
無論如何,我會盡力解釋爲什麼我認爲這是一個壞主意。當你實現Comparable
時,你正在定義一個所謂的「自然排序」,它是類本身固有的排序,是一種自然排序。這種排序應該涉及同一類的類和元素。所以,我認爲(這純粹是個人意見),你應該只實施Comparable
與你正在實施的類相同。
如果你想比較段與點,這當然是一個完全合法的事情,只要你有一個明確的排序。你可以通過實現一個所謂的「外部比較器」來實現,即實現Comparator<X>
的類,其中X是Point
和Segment
的共同超類。 Java標準類和函數準備始終接受可選的外部比較器,因爲通常,您可能希望對同一類的對象有不同的排序標準。
您似乎沒有共同的基類/接口。也許你應該定義一個,畢竟它們都是幾何實體。到目前爲止,您唯一能做的就是使用Comparator<Object>
,然後使用instanceof
運算符來檢查類型。這是很多樣板代碼,也是我認爲糟糕的設計:既然你說的要點和細分是可比的,他們應該有一些你想要比較的共同屬性。然後這個屬性應該成爲一個共同的基類或者他們都實現的接口的方法(這實際上可能會導致你再次使用Comparable
,但是以更清晰的方式)。
例如,假設您想根據座標來比較點和線段,並且希望在排序時考慮線段的中位數。然後,您可以執行以下操作:
public abstract class GeometricEntity implements Comparable<GeometricEntity> {
protected abstract Point getSortingPoint();
@Override
public int compareTo(GeometricEntity other) {
//Compare by getSortingPoint
}
}
public class Point implements GeometricEntity {
@Override
protected Point getSortingPoint() { return this; }
}
public class Segment implements GeometricEntity {
private Point ptFrom;
private Point ptTo;
@Override
protected Point getSortingPoint() { return meanPoint(ptFrom, ptTo); }
}
如果返回結果相同,爲什麼需要這樣實現? – 2015-02-10 09:57:30