我决定开始自己开展小型编码项目,专注于代码质量而不是代码数量,并对抽象类的使用有疑问。
现在我知道抽象类和接口之间的区别与最大的接口(我认为)是接口允许您只定义需要使用接口和类的类实现的方法,允许您定义方法和成员以及默认方法实现,如果你愿意的话。我的问题是使用抽象类与普通类的主要好处是什么?我能想到的两者之间唯一真正的区别是你不能创建一个抽象类的实例。这两者之间还有其他差异吗?
答案 0 :(得分:16)
从设计角度来看,最好简化一些事情。我认为简化事物的最佳方法是使用一个简单的类比。让我们用鸟类的比喻......
接口:当您想要强制执行需要定义的某些功能时,请使用此选项。例如IBird与ScreamLikeABird和Fly(界面功能)签订了合同。但是你可以更具体,并拥有一个拥有Run合同的IOstrich。你可能还有一个有攻击合同的IHawk ......等等。
摘要:当您想要强制执行基本功能并具有基本属性时,请使用此选项。例如Avian可能是鸟类的基类,可能有一个名为LayEgg的函数以及名为Age,Species,NumberOfChicks等的函数。这些东西不会/不应该改变鸟的行为,因为所有的鸟都会产卵......等等。但是当它以相同的方式尖叫或飞行时(有些甚至没有飞行)等等,并非所有的鸟都听起来都是一样的....因此它们应该通过接口来实现。
答案 1 :(得分:12)
除了无法创建抽象类的实例之外,某些语言可能支持在抽象类中使用抽象方法 - 类似于接口,抽象方法必须由继承自抽象类的类实现。
在我看来,抽象类的主要好处是是否有一些代码必须在相同类型的类之间共享。通常你可以使用一个接口,但有时这些类的功能可能重叠,你最终会得到代码重复。在这种情况下,您可以使用抽象类,只需将代码放在那里。
答案 2 :(得分:7)
在OO世界中,抽象类曾用于强加某些设计&实施约束。而已。在任何情况下,您都不必使用抽象类。但有些情况下你可能会更好地施加这些限制。那么它们是什么?让我们通过比较它们的对应物来看看。
抽象类与接口
如您所知,这是继承的两个主要概念。
基本上,接口仅用于声明您愿意继承底层服务,就是这样。不包含任何实现&没有功能。从这个意义上讲,界面是抽象的。这就是为什么它比设计约束更多的设计约束。想想扬声器上的耳机插孔。每个耳机需要实现插孔接口(带启动,停止,监听,转向,转向等方法)。每个耳机都应覆盖此接口,以继承扬声器提供的功能并相应地实现。
另一方面,抽象类可能包含具有实现的方法。这是基本的区别,在这个意义上它可以利用重用而不是接口。此外,它们可能包含私人,受保护和非静态字段,您不能通过接口。您可以强制子类使用抽象方法(没有实现的方法)实现一些必备功能。抽象类比接口更灵活。
当然更不用说,你可能只在java中扩展一个类,你可以实现接口数量。
抽象类与常规类
那么为什么不使用常规课呢?使用抽象类有什么好处?这很简单。如果使用抽象类,则强制核心功能由兄弟姐妹实现。作为开发人员,您无需记住应该实现基本功能。这是抽象类对常规类强加设计约束的地方。此外,通过使类抽象化,您可以避免意外创建(不完整)类。
答案 3 :(得分:1)
在我看来,抽象类在实际项目中更多地用于书籍。有时项目经理只提供方法声明,你必须编写方法的代码而不修改管理器提供的核心语法。这就是抽象类的使用方式。在简单类方法中同时定义,声明和编码,但不在抽象类中。 例如: -
abstract class Test
{
abstract void show();//method provided
}
class Child extends Test
{
void show()//coding
{
System.out.println("saurav");
}
}
class main
{
public static void main(String[] args)
{
Test c = new Child();
c.show();
}
}
答案 4 :(得分:0)
抽象类与常规类与接口。 抽象类通常支持泛化的概念,并通过设计多年项目来保持程序员保持一个很小的脑干,因为它们在包含抽象方法时必须描述在subling类中抽象方法的实现,但是,这个当开发人员有一个zeitnot时,feature是短期项目的缺点。
答案 5 :(得分:0)
将类声明为抽象的唯一原因是它无法实例化。在某些情况下,您将拥有在多个类之间共享的通用功能,但本身通用功能不代表对象或代表不完整的对象。在这种情况下,您将公共功能定义为抽象,以便它不能被实例化。
答案 6 :(得分:0)
用汽车制造术语来说,接口是“汽车”的规格表,它说它有四个轮子,五个座位,一个引擎等,而“抽象类”是放在箱子里的部分组装的汽车,完成自己的要求。例如。斯巴鲁对翼豹,森林人和XV / Crosstrek使用相同的底盘。因此,底盘是具有共同特性和功能的“抽象类”,但还不是“汽车”。必须在事实之后添加车身和内饰,然后才能说自己已经建造了汽车。尽管您可以选择将其替换为涡轮增压版本,但在这三个引擎中该引擎也是通用的。
答案 7 :(得分:-1)
这可能对你有帮助, 让我们考虑可以使用任何类型车辆的旅行者,如汽车,自行车,自行车等...... 但是所有车辆都以不同的速度限制以相同的方式移动,所以我们可以有一个
abstract class Avehicle
{
string fuel;
public void move()
{
sysout("moving");
}
}
但是所有违章的车辆都是不同的
interface Ivehicle
{
public void breakorstop();
}
class Traveler
{
Ivehicle v;
//Settrers and getters
public drive()
{
v.move();
}
public break()
{
v.breakorstop();
}
}
最后 Car或Cycle或Bike类可以扩展Avehicle并且可以实现Vehicle接口
答案 8 :(得分:-2)
抽象类可用于在基于OOP的“库”中存储方法;因为类不需要实例化,并且对它没有多大意义,所以将常见的静态方法保留在抽象类中是一种常见的做法。