当你制作一个类的子类时,你想什么时候制作父类(super class)abstract
因为据我所知,父类(super class)可以做任何抽象类可以做的事情。我对吗?
通过使其抽象化,您只是在限制自己实例化抽象类。
例如,有两个类,A 和 B
class A {
}
class B extends A {
}
和
abstract class A {
}
class B extends A {
}
有什么具体的区别吗?
或者,在概念上组织代码是使用抽象类作为父类(super class)的全部意义吗?例如,您想在每个子类都是其抽象父类(super class)的更具体类型(即水果>苹果、橙子、香蕉、葡萄、草莓等)的情况下使用抽象类,并且您想使用非-父子关系中的抽象父类(super class)?
什么时候使用抽象类,什么时候不使用,我能得到一个通用的答案吗?谢谢。
最佳答案
如果您不打算使用基类,abstract
直接类,使其抽象。
如
public abstract class Shape {
...
你不在乎使用
Shape
直接,因为它可以意味着任何东西,所以它应该是抽象的以防止实例化。但是抽象类包含有关子类的每个形状的重要信息和功能。例如形状的名称,或面积或边数,或其他任何东西。有时抽象类不实现函数,因为它们不知道子类可能想要如何实际处理它的处理。或者他们知道该怎么做,但根本做不到。一个例子
public abstract class NumberInRange<N extends Number>
public abstract boolean isGreaterThanOrEqualToMinBound(N n_n);
一个
Number
不能直接与另一个比较,因为它不是 Comparable
.但是 int 可以:public class IntInRange extends NumberInRange<Integer> {
public boolean isGreaterThanOrEqualToMinBound(Integer to_compareTo) {
return (this.compareTo(to_compareTo) >= 0);
}
所以
NumberInRange
必须是抽象的,并且 IntInRange
是具体的。您的问题也与 abstract-versus-interface 的问题有关。 .您可以继承多个接口(interface),但您只能扩展一个类(抽象或非抽象)。因此,接口(interface)为您提供了更大的灵 active 。
... 其中提出 inheritance-versus-composition 的问题...但我们将把那个留到以后:)
关于oop - 使用抽象父类(super class)的好的设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22031943/