为什么要烦扰抽象或接口类?

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等等,而不需要方法去关心它接收哪一个.

  • @kype:潜在的.这取决于您所看到的应用程序的生命周期.它非常适合上下文,但您确实需要了解抽象的目的,否则您无法正确应用它.请注意,抽象也可以使测试更容易,因为它允许您将实现与接口分离 - 因此您可以测试仅关注接口的内容,而不必将自己与具体实现联系起来. (2认同)

Pet*_*hev 7

如果要传递给任意方法,Shape您可以执行以下操作:

public void method(Shape shape) {
   int area = shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)

这称为多态性.如果没有抽象类或接口,则无法执行此操作.


Szy*_*mon 5

如果要根据共享的某些行为或属性对类进行分组,可以使用接口或抽象类.这将允许您使用接口/抽象类作为参数类型或泛型.例如,在您的情况下,您可以执行以下操作:

  1. 创建不同形状的列表List <Shape>.
  2. 将形状传递给方法.假设getArea()你的Shape类/接口有一个方法.您可以在一个在其实现中whichIsGreater (Shape shape1, Shape shape2)使用getArea()方法的方法中使用它.

使用接口或抽象类还有一个非常重要的方面.为您的类定义一个抽象类(或接口)可以显示您的代码设计的意图.有人会选择你的代码,通过正确定义的继承来理解它的任务会更容易.

良好代码设计的目标并不是真正编写尽可能短的代码.它是关于有效但也清晰且自我记录的代码.

为了完整答案,我重复了其他答案中提出的一些观点 - 没有任何不尊重的意图.