有效地重用多态方法的多个实现所共有的代码
Efficiently reusing code common to multiple implementations of a polymorphic method
我有一个形状。形状有圆形、三角形、方形。
class interface Shape(){
print();
sort();
}
如果 circle
、triangle
和 square
扩展 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");
}
}
我有一个形状。形状有圆形、三角形、方形。
class interface Shape(){
print();
sort();
}
如果 circle
、triangle
和 square
扩展 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");
}
}