1

使用以下样式之一从抽象父类声明方法的优点/缺点是什么:

选项1:

家长班:

protected Object retrieve(String id, Object model){
        return null;
}

儿童班:

@Override
public String retrieve(Object model) {
    if (model instanceof Car)
        // ... somehow get id ...
        return getInfo(id, (Car)model);
    return null;
}

或者...

选项 2:

家长班:

protected abstract Object retrieve(String id, Object model);

儿童班:

public String retrieve(String id, Object model) {
    if (model instanceof Car)
        return getInfo(id, (Car)model);
    return null;
}
4

4 回答 4

4

使用抽象类,可以保证子类将覆盖抽象方法(如果有的话)(或者本身是抽象的)。它们也不能被实例化,这很重要,因为它们缺少功能(抽象方法)。

另请参阅http://wiki.answers.com/Q/Use_of_abstract_class_in_java

抽象类类似于接口。你不能实例化它们,但你可以扩展它们。任何扩展抽象类的类都必须提供抽象方法的实现。因此,这些类可以用作可能需要一些通用功能的类似类的骨架。这样的功能也可以嵌入到这些类中。与接口不同,抽象类也可以有方法代码。所以它们非常有用。

这也可能有帮助:https ://softwareengineering.stackexchange.com/questions/96947/why-should-i-declare-a-class-as-an-abstract-class

于 2013-01-03T02:32:54.017 回答
3

在我看来,只有在所有子类都不会实现此功能时才需要第一种样式(认为用接口可能会更好地表达)。如果它是必要的功能,说抽象更清楚更不容易出错,因为编译器会唠叨你去实现它。

于 2013-01-03T02:32:56.173 回答
1

你在这里混合了苹果和橙子,可能还有一点:

  • @Override是编译时 ( @Retention(value=SOURCE)) 方法级 ( @Target(value=METHOD)) 注释,编译器使用它来检查给定方法是否:
    • interface(注意:JDK 1.6+)实现方法,或
    • 从一个类中实现一个abstract方法abstract,或者
    • 覆盖父类的非final方法(无论该父类是否abstract
  • abstract是可以在类级别或方法级别声明 的语言关键字:
    • 如果在类级别,这意味着该类不能直接实例化,因此您必须将其子类化(但是,这样的abstract可以static承载返回自身子类的工厂方法);
    • 如果在方法级别,该方法只有一个原型(见下文)并且子类必须实现该方法;

abstract请注意,如果类本身不是,则将方法声明为是非法的abstract

另请注意,这是可能的:

public abstract class MustHaveToString
{
    // .toString() is implemented in Object, here we FORCE children of that class
    // to re-implement it. As the method is abstract, we only declare its 
    // prototype (its return type and method arguments, in this case, none).
    // As the method originates from one of our parents (Object), 
    // we can also @Override it!
    @Override
    public abstract String toString();
}
于 2013-01-03T02:42:59.850 回答
1

首先,您的选项“1”是方法重载的一个示例。其次,假设您的意思是方法覆盖,在选项“1”中,您始终可以从覆盖的方法中调用“super.method”。这在技术上在选项“2”中是不允许的。因此,这两种技术没有“优点”或缺点。

更接近“选项 2”(不声明“抽象”)的方法如下:

public abstract class Parent {
  protected Object retrieve(String id, Object model) {
    throw new UnsupportedOperationException(...);
  }
}
于 2013-01-03T02:54:10.607 回答