为什么使用Abstract类而不是扩展Class并实现接口?

时间:2016-11-01 09:11:11

标签: java oop interface abstract-class

我的疑问或论点是 -

可以通过扩展Concrete类并实现接口来替换Abstract类。

如何或什么?

Abstract类包含什么?实现某些默认行为的方法。不同的访问修饰符。可以扩展另一个抽象类。可以实例化。等等...

所有这些都可以使用Concrete类来实现。 当需要维护结构而没有实现时,我们可以使用接口。

我可以看到Abstract Class是一个混凝土类和组合的组合。接口

显示一些代码 -

public abstract class MobilePhone {
   abstract public String getPhoneModel();
   public String getIMEI(){
       // Consider execute() is some function that returns us IMEI for now
       return execute("*#06#");
   }
}


public class SamsungPhone extends MobilePhone {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}

public class iPhone extends MobilePhone {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getiphoneModelFromDB(imei);
    }
}

如果我们做这样的事情,也可以实现同样的目标 -

public class MobilePhone {
   public String getIMEI(){
       // Consider execute() is some function that returns us IMEI for now
       return execute("*#06#");
   }
}

public interface Imobile {
    String getPhoneModel();
}

public class SamsungPhone extends MobilePhone implements Imobile {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}

public class iPhone extends MobilePhone implements Imobile {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}

抽象类的特殊用例或需要是什么?

引用 -

When to use an interface instead of an abstract class and vice versa?

When do I have to use interfaces instead of abstract classes?

How should I have explained the difference between an Interface and an Abstract class?

Oracle Docs - Abstract Class

还有更多(但它们没那么有用)

PS:我不是指抽象类和接口之间的区别

1 个答案:

答案 0 :(得分:3)

抽象类允许您修复行为,例如:

public abstract class Foo {

  protected abstract int getValue();

  public final void doTheFoo() {
    int value = getValue();
    ... do something ...
  }

通过使用这种方法,您可以保证 doTheFoo()的行为不能被Foo的子类更改。但是你仍然可以扩展Foo并允许那些子类对 doTheFoo()将要做的事情产生某种影响

这是你可以用具体的类+接口做的事情。

另一个核心方面:请记住,此类概念也是沟通的意思。通过抽象关键字,您可以告诉您的"观众"你做希望实例化该类。如果那对你有价值,那么现在不是真正的要点;因为这个概念对于Java的父亲来说非常重要,使其成为语言的一部分。