3

我知道抽象类和具体类之间的区别很少。我知道与具体类不同,您不能使用抽象类创建实例,抽象类可以具有“抽象”方法。

但我有一个像下面这样的例子。很多时候,我们在工作中看到以下示例。我将跳过一些可以在 Parent 类中定义的常用方法。

public abstract class Parent {
    public void init() {
       doInit();
    }
    public abstract void doInit();
}

public class Child extends Parent {
    public void doInit() {
       // implementation
    }
}

我认为我们可以用如下的具体类做同样的事情。

public class Parent {
    public void init() {
      doInit();
    }
    public void doInit() {
       // Empty
    }
}

我很好奇是否有任何独特的情况需要我们使用抽象类。上面的例子在运行时有什么显着差异吗?

谢谢你。

4

4 回答 4

7

在这种情况下使用abstract类的原因是强制继承你的基类的每个人都重写抽象doInit方法。如果没有抽象的类和方法,它们可能会忘记这样做,编译器也不会捕捉到它们。

除了这个实用目的之外,抽象类还提供了一种强大的方式来将您的设计理念传达给代码的读者。抽象类告诉读者,其中的方法为一组相关类提供了一些通用实现,而不是实现您正在建模的单个概念。很多时候,向读者传达你的意图与编写正确的代码一样重要,否则他们可能会在维护代码的同时破坏某些东西。

Java 中习惯于调用抽象类Abstract...;在你的例子中,那将是AbstractParent.

于 2012-07-27T03:05:24.350 回答
2

具体的类是具有所有方法的实现(内部代码)的类。它是否派生自其他类并不重要。

public abstract class IAmAbstract{
    public void writeMe(){
        System.out.println("I am done with writing");
    }
}

public class IAmConcrete extends IAmAbstract{
    public void writeMe(){
        System.out.println("I am still writing");
    }
} 
于 2013-07-02T19:07:33.667 回答
2

当然,您可以这样做,但这完全取决于正确的业务逻辑。可能会出现一种情况,您希望对扩展您的代码的人强制执行策略。

例如,我编写了一个 Employee 类,而您扩展了我的类以编写 ProjectManager 类。但是假设业务不允许直接实例化 Employee(就像我说的,只是一个例子)。所以我将我的 Employee 类声明为抽象类,从而对我的类的所有扩展程序(读:you)强制执行他们不能直接实例化 Employee 的规则。(当然,它会通过继承链间接发生,即父对象在子对象之前创建。)

如果使用得当,A 地的一个人控制 B 地的另一个人如何编码。

于 2012-07-27T04:06:36.117 回答
0

抽象类在软件设计中具有多种有用的属性。

除了明显的区别,比如不能被实例化和能够持有抽象方法。它们对于定义通用但可覆盖的函数、保存以逻辑方式处理其子级的静态方法很有用。

我最喜欢的是抽象工厂模式。

通过创建一个作为它可能创建的所有类的父级的工厂,它可以强制创建所需的功能,这实际上导致了一个奇怪的伪影,其中技术上更紧密耦合的代码实际上更容易维护。

于 2012-07-27T03:26:05.043 回答