【问题标题】:What is a good design pattern for using an abstract superclass?使用抽象超类的好的设计模式是什么?
【发布时间】:2014-03-28 17:21:57
【问题描述】:

当你创建一个类的子类时,你什么时候想创建超类abstract,因为据我所知,超类可以做任何抽象类可以做的事情。我对吗?

通过使其抽象化,您只是在限制自己实例化抽象类。

例如,有两个类,A 和 B

class A {


}

class B extends A {


} 

abstract class A {


}

class B extends A {


} 

有什么具体的区别吗?

或者,在概念上组织代码是使用抽象类作为超类的全部意义吗?例如,您想在每个子类都是其抽象超类的更具体类型(即水果>苹果、橙子、香蕉、葡萄、草莓等)的情况下使用抽象类,并且您想使用非-父子关系中的抽象超类?

我能得到一个通用的答案,什么时候使用抽象类,什么时候不使用?谢谢。

【问题讨论】:

    标签: oop inheritance abstract-class abstract superclass


    【解决方案1】:

    如果您不打算直接使用基类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...的问题,但我们将把它留到以后:)

    【讨论】:

      【解决方案2】:

      主要原因是delegation。接口非常适合合约(即,如果你说你实现了我的接口,这些是你必须做的事情)。但是,接口不强制执行任何功能,只是您使用某些参数遵守这些方法名称并返回一些预先协商的类型。

      抽象是一种提供基本功能并强制您提供有关需要完成的实现细节的方法。当类可以最好地用作anonymous class 时,抽象类非常有用,其中除了填充方法中发生的细节之外的所有细节都需要。这种模式被广泛用作Event handlers in Swing 的适配器。

      【讨论】:

        【解决方案3】:

        超类更像是一个通用类。现在假设,您要开发一个涉及语言翻译的应用程序。你要做的是,声明一个抽象类 Speak,它具有通用方法,比如 translate()。你有来自俄罗斯、中国、印度等国的开发者。特定语言的翻译会与其他语言不同(俄语与普通话不同)。所以你把实现细节留给程序员。他将按照规范执行细节。会有诸如俄语之类的类将扩展抽象类 Speak 并实现该语言的 translate() 方法。 translate 方法的所有实现都是独立的,由开发人员决定。希望这会有所帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多