我知道创建抽象类背后的概念用途,即为其子类定义一个公共接口,其中某些实现留给各个子类。
我是否在我的假设中纠正了技术上抽象类的必要,因为您仍然可以覆盖超类方法?是否只是创建抽象类以使开发人员更清楚地了解这些类的意图?
我的意思示例:
// Using an abstract class
abstract class Car
{
int fuel;
int getFuel()
{
return this.fuel;
}
abstract String getColor();
}
class RedCar extends Car
{
String getColor()
{
return "red";
}
}
// Without an abstract class
class Car
{
int fuel;
int getFuel()
{
return this.fuel;
}
String getColor()
{
return "defaultColor";
}
class RedCar extends Car
{
String getColor()
{
return "red";
}
}
答案 0 :(得分:5)
是否只是创建了抽象类以使开发人员更清楚地了解类的意图?
是的,但是它也阻止开发人员做“愚蠢的”事情。
例如,您不能创建抽象类的实例。在您的代码上下文中,创建“通用” Car
没有任何意义。您只能创建BlueCar
或RedCar
或其他子类。尽管anonymous subclass的实例看起来像抽象类的实例,但它们最终都是由子类构建的。但是,如果使Car
类抽象化,则开发人员将不会意外地创建Car
的实例,因为编译器会抱怨。
抽象类还强制开发人员实现抽象方法。使用您的非抽象Car
类,我可以继承它,而忘了需要覆盖getColor
。现在,代码的其他一些部分可能会调用getColor
并得到一个毫无意义的结果“ defaultcolor”。什么是默认颜色?使方法抽象化会迫使子类考虑实现所需的方法。
答案 1 :(得分:-1)
我认识的大多数人都避免使用抽象类。从应用程序程序员的角度来看,我的观点是应避免使用抽象类。使用界面非常灵活,不会强迫您的工作遵循类层次结构。
正式一点:抽象类是严格的继承,而接口是组成。
创建类库时,抽象类很有用的示例。抽象类强制执行的层次结构可使应用程序程序员更容易理解该库。但是,我确实相信这样做会以更长的库开发时间为代价。