在Java中使用多态中的抽象类是一种好的/通常的做法吗?

时间:2013-11-08 13:01:26

标签: java oop polymorphism abstract-class

在所有示例中,我都看到接口用于实现多态性。现在我们使用抽象类

获得以下代码
AbstractClass parent = new Child();

Here该男子声称

  

一个常见的论点是多态性仅适用于接口和   不是抽象类。

我认为他的意思是它们通常是Java中多态性中使用的接口。我看到很多人发现他的问题很愚蠢,想要网址。这是我发现的here。所以我的问题是在Java中使用多态中的抽象类(在我的例子中 - 因为多态性是非常宽的定义)是一种好的/通常的做法吗?

7 个答案:

答案 0 :(得分:4)

优良作法是使用符合合同的最一般的父母;如果接口定义了您需要的所有函数签名,则使用它们而不是实现该接口的抽象类。 Bill Venners与Erich Gamma讨论的文章Design Principles from Design Patterns详细介绍。

答案 1 :(得分:1)

他们最好的用途之一是“孩子”之间有共同的行为。

您的界面

interface Drawable{
    void paint();
}

具有公共代码的抽象类

abstract class AbstractRectangularObject implements Drawable{

    public void paint(){
         paintVertices();
         //your code to fill body
    }

    //Abstract method that all subclases needs to implement
    protected abstract void paintVertices();

}

您真正的子类

class Rectangle extends AbstractRectangularObject {
     protected void paintVertices(){
         //code to pain vertices
     }
}

-

class RoundRectangle extends AbstractRectangularObject {
     protected void paintVertices(){
         //code to pain vertices
     }
}

答案 2 :(得分:0)

如果您在子类之间共享共同的功能和属性,同时类本身太抽象而无法拥有实例,那么使用抽象类将是一种好习惯。如果不是,我宁愿使用接口。

答案 3 :(得分:0)

总的来说,是的。使用必要的最不具体的类型总是好的做法。这也适用于具体的超类,而不仅仅是抽象类和接口。

public class MyClass{} // not an interface and not abstract
public class SubClass extends MyClass{}

public class OtherClass{
    public MyClass getMyClass(){
         return new SubClass();
    }
]

在实践中,这取决于具体情况。如果一切都包含在一个方法的范围内,那真的没关系。

public void doStuff(){ // void method, so never going return any details
   AbstractFoo foo1= new ConcreteFoo();
   // no better than
   ConcreteFoo foo2 = new ConcreteFoo();
   // because nothing external to this method will ever know 
}

然而,让开发人员总是使用最不具体的实现(或接口)背后的原因是让它成为习惯。

答案 4 :(得分:0)

答案取决于您的背景。

示例:

 // Abstract class template
abstract class AbstractFirst {
  public void doSomething(){
    this.doOne();
    this.doSecond();
    System.out.println("");
    System.out.println("Test");
  }
   public abstract void doOne();
   public abstract void doSecond();
}

// Concrete implementation
class ConcreteFirst extends AbstractFirst {
   public void doOne(){System.out.print("One"); }       // must be implemented
   public void doSecond(){System.out.print("Second"); } // must be implemented

   public static void main(String[] args){
       ConcreteFirst cf = new ConcreteFirst();
       c.doSomething();
   }
}

打印

OneSecond 
Test

到控制台。接口无法实现这一点。此模式称为“模板方法模式”,是GoF模式之一

答案 5 :(得分:0)

关于你的问题,没有这样的观点认为使用polimorphism是一种不好的做法,在适用的地方使用它是一个好习惯,但它取决于你定义类纯粹虚拟的要求的用例接口

答案 6 :(得分:0)

至于我的经验,抽象类总是包含一些接口的部分实现。例如,EJB就是这种情况。它是一种更好的设计,可以使API及其实现保持独立,甚至是部分的。所以我建议创建一个接口和一个抽象类。但是对于引用,使用接口而不是抽象类。