【问题标题】:Why are there abstract classes in the first place?为什么首先有抽象类?
【发布时间】:2019-05-30 14:08:07
【问题描述】:

我知道创建抽象类背后的概念用途,即为其子类定义一个公共接口,其中一些实现留给各个子类。

我的假设是否正确,即技术上不需要抽象类,因为无论如何您都可以覆盖超类方法?抽象类是否只是为了让开发人员更清楚类的意图而创建的?

我的意思的例子:

// Using an abstract class
abstract class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    abstract String getColor();
}

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}


// Without an abstract class
class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    String getColor()
    {
         return "defaultColor";
    }

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}

【问题讨论】:

  • 在将默认方法添加到接口之前,抽象类是允许类共享通用功能(和代码)的一种方式。如果你的抽象类只包含抽象方法,那么接口总是更好的选择。
  • “技术上”没有理由拥有除了字节码之外的任何东西,所以这个论点就在窗外。抽象类让您可以定义一组对象的底层通用功能,而无需共同方面本身构成一个应该是可实例化的合理类。例如,银行账户是一个抽象概念:它与一个人相关联,可以用于存款和取款,但“银行账户”什么都不是,并且允许代码创建“银行账户”而不是“支票”帐户”或“储蓄帐户”等没有意义。所以,抽象吧。
  • 此外,任何教 Java 的半体面的网站或书籍都会解释为什么抽象类很有用。
  • 抽象类允许实现具有可变部分的算法,其中可变部分是抽象方法。一个例子是模板方法设计模式,查看Implementing the Template Method Pattern in Java了解更多详情
  • 它就像一个类接口混合体。如果要从中构造对象(如接口),则必须对其进行扩展,它可以具有已定义的方法(如常规类),并且可以具有必须由子类定义的方法(如接口)。

标签: java class oop object abstract-class


【解决方案1】:

创建抽象类是为了让开发人员更清楚这些类的意图吗?

没错,但它也阻止了开发人员做“愚蠢”的事情。

例如,您不能创建抽象类的实例。在您的代码上下文中,创建“通用”Car 是没有意义的。您只能创建 BlueCarRedCar 或其他一些子类。虽然anonymous subclass 的实例可能看起来像抽象类的实例,但它们最终是由子类 构造的。但是,如果您将Car 类抽象化,开发人员不会意外创建Car 的实例,因为编译器会报错。

抽象类还强制开发人员实现抽象方法。使用您的非抽象Car 类,我可以继承它而忘记我需要覆盖getColor。现在代码的其他一些部分可能会调用getColor 并得到一个无意义的结果“defaultcolor”。什么是默认颜色?将方法抽象化会迫使子类考虑实现所需的方法。

【讨论】:

  • 我相信this 在您的回答中值得一提。它可以为未来的观众带来一些好处。
  • @CardinalSystem 我不太确定如何将该链接插入到感觉自然的地方。欢迎提出修改建议。
【解决方案2】:

我认识的大多数人都避免使用抽象类。从应用程序程序员的角度来看,我的意见是应该避免使用抽象类。使用接口更加灵活,不会强迫您的工作遵循类层次结构。

有点正式:抽象类是严格的继承,而接口是组合

抽象类有用的一个例子是在创建类库时。抽象类强制执行的层次结构可以使应用程序程序员更容易理解该库。但是,我确实认为这是以库的开发时间更长为代价的。

【讨论】:

  • 公平地说,抽象类在语言支持接口之前的日子里更受欢迎。即便如此,使用继承来增强或限制或细化基类仍然是使用抽象类的主要原因。在这方面,接口使抽象类更强大,因为它甚至允许对类的更改进行抽象。
  • 几乎没有人在编写应用程序时使用抽象类。最后,接近交付时经常发生的情况是,围绕哪些接口应该变形为抽象类存在争论。如果最终的交付物是类库之类的东西,那么我承认这项工作是值得的。但是,如果它的应用程序将来可能会发生很大变化,那么保持所有接口不变会更有意义。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多