java - 为什么要为抽象类或接口(interface)类烦恼呢?

标签 java inheritance polymorphism

这一直让我感到困惑,为什么最好有一个抽象类。所以可以说我必须计算不同形状(圆形,矩形)的面积。我被教导最好有一个抽象/界面形状,然后是 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;
    }
}

看起来形状类没有任何用处。我不能在形状类中执行 getArea,因为不同的形状计算面积不同。我可以删除形状类并使我的代码更简单。

那么拥有抽象/接口(interface)类形状的实际目的是什么?提前感谢您的任何解释

最佳答案

It seems like shape class serves no purpose. I can't do an impementation of getArea in shape class, since different shapes calculate area differently. I could just remove shape class and make my code simpler.

假设您有一张由多种形状组成的图片 - 一些圆形、一些矩形等。您可以将所有这些形状存储在 List<Shape> 中。 ,然后使用以下方法计算总面积:

int totalArea = 0;
for (Shape shape : shapes) {
    totalArea += shape.getArea();
}

如果你没有一个通用的 Shape,你会怎么做?类还是接口(interface)?你的Picture类必须了解每个单独的形状类,而不是使用不同形状类之间的共性来使代码更通用。

再举一个例子,考虑流。想象一下,我们没有 InputStream类 - 我们只有单独的子类。然后,每次您编写必须读取一些数据的代码时,您都必须为您希望能够处理的每个单独的子类提供一个重载,即使每个方法中的代码完全相同。 InputStream抽象出差异,暴露共同的功能(阅读、跳过等)。这样你就可以编写一个只需要 InputStream 的方法。 , 然后用 FileInputStream 调用它, 或 ByteArrayInputStream等等...无需关心接收到的方法。

关于java - 为什么要为抽象类或接口(interface)类烦恼呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19463863/

相关文章:

java - 我如何通过 esper 订购 Activity ?

Javascript - 经理是一个人而不是经理本身?功能/原型(prototype)继承

具有模板类和动态调度的 C++ 共享指针

c++ - 一个内部表示不暴露给用户并且可以透明改变的类,这个例子是什么?

c++ - 继承和方法重载

java - 如果覆盖的保留策略是源,运行时多态性如何工作

java - 您是否应该为网络应用程序的每次上传使用单独的 SSH session

java - forName 和 GetClassLoader 的使用

java - 学习android-创建一个类并稍作修改以重用代码-sdk

c++ - 我可以强制 C++ 类是非抽象的吗?