当你创建一个类的子类时,你何时想要创建超类abstract
,因为根据我的知识,超类可以做任何抽象类所能做的事情。我对吗?
通过使它抽象化,你只是限制自己实例化抽象类。
例如,有两个类,A和B
class A {
}
class B extends A {
}
和
abstract class A {
}
class B extends A {
}
有没有具体的区别?
或者,从概念上组织代码是否将抽象类用作超类?例如,你想在这样的情况下使用抽象类,每个子类是其抽象超类的更具体类型(即Fruit> apple,orange,banana,grape,strawberry等)并且你想要使用爸爸和儿子之间关系中的非抽象超类?
我可以在使用抽象类时获得一般性答案,何时不能?感谢。
答案 0 :(得分:4)
如果您不打算直接使用基类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的问题。您可以继承多个接口,但只扩展一个类(抽象或不抽象)。因此,接口为您提供了更大的灵活性。
... 提出了inheritance-versus-composition的问题......但我们会留下以后的问题:)
答案 1 :(得分:2)
主要原因是delegation。接口非常适合合同(即,如果你说你实现我的界面,这些是你必须做的事情)。但是,接口不会强制执行任何功能,只是您使用这样的参数来遵守这些方法名称并返回一些预先协商的类型。
抽象是一种提供基本功能的方法,并强制您提供有关您需要完成的内容的实施细节。当类可以最好地用作anonymous class时,抽象类非常有用,除了需要填充方法中发生的细节之外的所有细节。这种模式被广泛用作Event handlers in Swing的适配器。
答案 2 :(得分:1)
超级班级更像是一般班级。现在假设,您想要开发一个涉及语言翻译的应用程序。你要做的是,声明一个抽象类,Speak,它有一般方法,比如translate()。您有来自俄罗斯,中国,印度等的开发人员。特定语言的翻译将与其他语言不同(俄语与普通话不同)。因此,您将实现细节留给程序员。他将按照规范实施细节。会有像俄语这样的类,它们将扩展抽象类Speak并使用该语言实现translate()方法。 translate方法的所有实现都是独立的,由开发人员决定。希望这有帮助