kyp*_*ype 8 java polymorphism inheritance
这令人难以理解为什么最好有一个抽象类.所以我要说我必须计算不同形状的区域(圆形,矩形).我被教会更好地拥有一个抽象/界面形状,然后像Rectangle,Circle这样的类扩展它.
我做了以下代码
abstract class Shape {
abstract int getArea();
}
class Rectangle extends Shape{
private int width;
private int height;
public Rectangle (){
this.width = width;
this.height = height;
}
// get set methods ommited
public int getArea () {
return width * height;
}
}
Run Code Online (Sandbox Code Playgroud)
看起来形状类没有用处.我不能在形状类中执行getArea的实现,因为不同的形状会以不同的方式计算区域.我可以删除shape类并使我的代码更简单.
那么具有抽象/接口类形状的实际目的是什么?提前感谢您的任何解释
Jon*_*eet 16
看起来形状类没有用处.我不能在形状类中执行getArea的实现,因为不同的形状会以不同的方式计算区域.我可以删除shape类并使我的代码更简单.
假设您有一个由多个形状组成的图片 - 一些圆形,一些矩形等.您可以将所有这些形状存储在a中List<Shape>,然后使用以下方法计算总面积:
int totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
如果你没有通用的Shape类或接口,你会怎么做?您的Picture类必须知道每个单独的形状类,而不是使用不同形状类之间的共性来使代码更通用.
另一个例子,考虑流.想象一下,我们没有这个InputStream类 - 我们只有个别的子类.然后,你每次写代码的时间,这不得不读一些数据,你必须为你想成为能够处理,即使代码将在每个方法完全相同的每个单独的子类提供过载.InputStream抽象差异,揭示共同的功能(阅读,跳过等).这样,你可以写一个方法,它只是需要InputStream,然后用它打电话FileInputStream,或ByteArrayInputStream等等,而不需要方法去关心它接收哪一个.
如果要传递给任意方法,Shape您可以执行以下操作:
public void method(Shape shape) {
int area = shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
这称为多态性.如果没有抽象类或接口,则无法执行此操作.
如果要根据共享的某些行为或属性对类进行分组,可以使用接口或抽象类.这将允许您使用接口/抽象类作为参数类型或泛型.例如,在您的情况下,您可以执行以下操作:
List <Shape>.getArea()你的Shape类/接口有一个方法.您可以在一个在其实现中whichIsGreater (Shape shape1, Shape shape2)使用getArea()方法的方法中使用它.使用接口或抽象类还有一个非常重要的方面.为您的类定义一个抽象类(或接口)可以显示您的代码设计的意图.有人会选择你的代码,通过正确定义的继承来理解它的任务会更容易.
良好代码设计的目标并不是真正编写尽可能短的代码.它是关于有效但也清晰且自我记录的代码.
为了完整答案,我重复了其他答案中提出的一些观点 - 没有任何不尊重的意图.