当前位置: 首页 > 知识库问答 >
问题:

如果我们有压倒一切的概念,为什么要抽象?[重复]

单于骁
2023-03-14

如果我们有覆盖的概念,为什么我们应该选择抽象类。无论如何,我们必须扩展抽象类来给出抽象方法的定义,我们可以简单地扩展和重写它的抽象方法,那么使它抽象的逻辑是什么呢?

共有3个答案

百里京
2023-03-14

类动物:

public abstract class Animal{
    protected abstract void makeNoise();
}

狗:

class Dog extends Animal{
    protected void makeNoise(){
        print("woof");
    }
}

猫:

class Cat extends Animal{
    protected void makeNoise(){
        print("meow");
    }
}

当我想要一些噪音:

private Animal animal;  // could be a (cute) dog or a cat or something else.
public void makeNoise(){
    this.animal.makeNoise();
}

总之,抽象类给出了定义,正如您所说。定义可能很重要,尤其是当我想在不知道细节的情况下实现特定逻辑时。

蒲昊苍
2023-03-14

抽象方法不能有实现,所以在抽象类中提供实现并不是为了在(具体的)子类中重写它。

抽象方法的目的是定义所有子类都将拥有的公共行为。然而,这种行为在抽象类级别是未知的。举个简单的例子:

abstract public class Animal {
    public abstract void eat();
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("I eat dog biscuits");
    }
}

在这里,所有的动物都吃东西,但我们不知道它们一开始吃什么,直到我们创建了一个特定的子类。抽象的方法非常适合这个问题。

温峻熙
2023-03-14

比如说,你将生产很多不同类型的汽车:家用车、跑车、F1赛车。。。

对于所有这些,accelerate()方法将有一个非常不同的实现。假设您不会将Car作为抽象类,并提供accelerate的实现。

如果有人要制造一辆F1赛车,他可能会想:我们已经有了加速的功能,没有理由不使用它。最终,我们可能会以完全相同的方式加速所有类型的汽车。

这将导致非常缓慢的F1比赛,或基本的交通,即使是闪光灯也不想成为行人。

抽象类是告诉“做什么”,而不是“如何做”,但也有可能添加一些非抽象方法,不像接口。

 类似资料:
  • 问题内容: 如果我们使用ExecutorCompletionService,则可以将一系列任务作为s 提交,并将结果作为进行交互。 但也有在的,它接受一个任务,我们得到的名单,以检索结果。 据我所知,使用一个或多个都不会有任何好处(除了我们避免使用循环,否则我们将不得不对任务进行操作),并且基本上它们是相同的想法,只是稍有不同。 那么,为什么有两种不同的方式提交一系列任务呢?我在性能上正确吗?有没

  • 适用于类的语法不适用于概念: MSVC对“专门化”一行说:。 为什么概念不能专门化?有理论上的原因吗?

  • 概括来说,从 Saga 内触发异步操作(Side Effect)总是由 yield 一些声明式的 Effect 来完成的 (你也可以直接 yield Promise,但是这会让测试变得困难,就像我们在第一节中看到的一样)。 一个 Saga 所做的实际上是组合那些所有的 Effect,共同实现所需的控制流。 最简单的是只需把 yield 一个接一个地放置,就可对 yield 过的 Effect 进行

  • 问题内容: 我想知道一个仅在Eclipse上使用Maven或Ant的具体示例。 当我在Eclipse中进行开发时,Eclipse会为我做所有事情,而我只需要单击run按钮。而且,Eclipse可以让您将代码导出到Windows的可运行jar或.exe中。 所以我真的不知道为什么我需要Maven或Ant。 而且,如果确实需要, 我应该选择Maven还是Ant? 问题答案: 因为您的同事可能更喜欢Ne

  • 当你学习 Dart 语言的时候,请记住以下事实和概念: 所有可以放在一个变量里面的东西都是对象,而且所有对象都是类的实例。每一个数值、函数和 null 都是对象。所有的对象都继承自 Object 类。 尽管 Dart 是强类型的,但是 Dart 支持类型推断所以类型声明是可选的。在上面的代码中,number 被推断为类型 int。当你想要显式声明没有预期的类型时,使用特殊的 dynamic 类型。

  • 我在这里(有点)了解jdk 5 Reentry antLock的功能 但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?