oop - 使用抽象父类(super class)的好的设计模式是什么?

标签 oop inheritance abstract-class abstract superclass

当你制作一个类的子类时,你想什么时候制作父类(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/

相关文章:

java - 如何使用数组内部的整数作为方法的参数。 (测试员)

python - 使用函数在类中设置列表名称

javascript OOP - 为什么参数对象在实例方法中不可见?

javascript - 使用 Object.create() 的对象创建模式

JavaScript继承机制

Python:继承类函数(属性 getter )不起作用

kotlin - 开放类和抽象类有什么区别?

c++ - 防止通过纯虚函数实例化类?

java - 在 Java 中传递抽象类

java - 移植包括状态的 Java 对象(经过训练的 LIBSVM)