使用以下某个样式而不是从抽象父类声明方法有哪些优点/缺点:
选项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;
}
答案 0 :(得分:4)
使用抽象类,可以保证子项将覆盖抽象方法(如果有的话)(或者本身是抽象的)。它们也不能被实例化,这很重要,因为它们缺少功能(抽象方法)。
另见http://wiki.answers.com/Q/Use_of_abstract_class_in_java:
Abstract类与接口类似。你无法实例化 他们,但你可以扩展它们。任何扩展抽象的类 class必须为抽象方法提供实现。于是 这些类可以用作类似类的骨架 可能需要通用功能。这样的功能也可以 嵌入这些类。与接口不同,抽象类可以 也有方法代码。所以它们非常有用。
答案 1 :(得分:3)
在我看来,只有当所有子类都没有实现这个函数时才需要第一个样式(想想可能用接口更好地表达)。如果它是必要的函数,那么更清楚地说抽象,更不容易出错,因为编译器会唠叨你实现它。
答案 2 :(得分: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();
}
答案 3 :(得分:1)
首先,您的选项'1'是方法重载的示例。其次,假设你的意思是方法覆盖,在选项'1'中你总是可以从重写方法中调用'super.method'。这在技术上不允许在选项'2'中。因此,这两种技术没有“优点”或“缺点”。
更接近你的'选项2'(不声明'抽象')如下:
public abstract class Parent {
protected Object retrieve(String id, Object model) {
throw new UnsupportedOperationException(...);
}
}