在所有示例中,我都看到接口用于实现多态性。现在我们使用抽象类
获得以下代码AbstractClass parent = new Child();
Here该男子声称
一个常见的论点是多态性仅适用于接口和 不是抽象类。
我认为他的意思是它们通常是Java中多态性中使用的接口。我看到很多人发现他的问题很愚蠢,想要网址。这是我发现的here。所以我的问题是在Java中使用多态中的抽象类(在我的例子中 - 因为多态性是非常宽的定义)是一种好的/通常的做法吗?
答案 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及其实现保持独立,甚至是部分的。所以我建议创建一个接口和一个抽象类。但是对于引用,使用接口而不是抽象类。