有效地重用多态方法的多个实现所共有的代码

Efficiently reusing code common to multiple implementations of a polymorphic method

我有一个形状。形状有圆形、三角形、方形。

class interface Shape(){
   print();
   sort(); 
}

如果 circletrianglesquare 扩展 shape,并且 sort() 的代码对于所有形状几乎相同,我如何才能在圆形、三角形和正方形中使用 sort() 而不添加主体实现?

我可以在 shape 中有一个具体的实现,但我总是被告知不要那样做。

你如何定义不同类型形状的顺序?

如果它是任意顺序,例如 - 首先是圆形,然后是三角形,最后是正方形 - 您的比较方法必须知道所有这些类型。

如果您根据所有形状共享的某些属性(例如面积)定义顺序,则可以在您的形状 class 中实现比较方法,而无需它知道任何子 classes.

顺便说一句,如果您的 sort() 方法应该对形状集合进行排序,那么您不需要它。使用 Collections.sort 并实施 Comparator<Shape>Comparable<Shape>.

使用 abstract class,它允许您 实现 sort() 方法(class 行为) 和 定义 print() 方法(interface 行为):

public abstract class AbstractShape
{
    public abstract void print();

    public void sort(AbstractShape[] shapes) {
        // make your own implementation -> sort shapes
    }
}

public class Circle extends AbstractShape
{
    @Override public void print() {
        System.out.println("I'm a circle");
    }
}

public class Triangle extends AbstractShape
{
    @Override public void print() {
        System.out.println("I'm a triangle");
    }
}

public class Square extends AbstractShape
{
   @Override public void print() {
        System.out.println("I'm a square");
    }
}