我已经决定开始自己做一些小的编码项目,这些项目关注的是代码质量而不是代码数量,并对抽象类的使用有一个问题。
现在我知道了抽象类和接口之间的区别,最大的区别(我认为)是接口只允许您定义需要由使用接口的类实现的方法,而抽象类允许您定义方法和成员以及默认的方法实现。我的问题是,与普通类相比,使用抽象类的主要好处是什么?我能想到的两者之间唯一的真正区别是,您不能创建抽象类的实例。这两者之间还有其他区别吗?
发布于 2010-07-06 06:43:11
严格地从设计的角度来看,最好是简化事情。我认为简化事情的最好方法是使用一个简单的类比。让我们打个比方,打个比方。
接口:当您想要强制执行某些需要定义的函数时,请使用此接口。例如,IBird为ScreamLikeABird和Fly (接口函数)签订了一份合同。但您可以获得更具体的内容,并拥有一个具有运行契约的IOstrich。您也可能拥有具有攻击contract...etc的IHawk。
摘要:当您想要强制执行基本函数并具有基本属性时,请使用此函数。例如,禽类可能是鸟类的基类,可能具有名为LayEgg的功能以及名为年龄、物种、NumberOfChicks...etc的属性。这些事情不会/不应该改变一只鸟的行为,因为所有的鸟都会下eggs...etc。但并不是所有的鸟在尖叫或以相同的方式飞行(有些甚至不会飞)....etc时听起来都是一样的。因此,它们应该通过接口实现。
发布于 2010-07-06 06:23:40
除了不能创建抽象类的实例之外,一些语言可能支持在抽象类中包含抽象方法-类似于接口,抽象方法必须由继承自抽象类的类实现。
在我看来,抽象类的主要好处是如果有一些代码必须在相同类型的类之间共享。通常,您可以使用一个接口来实现这一点,但有时这些类的功能可能会重叠,最终会导致代码重复。在这种情况下,您可以使用抽象类并将代码放在那里。
发布于 2015-11-10 20:08:00
在面向对象的世界中,抽象类用于施加一些设计和实现约束。没别的了。在任何情况下,您都不需要使用抽象类。但在某些情况下,您最好施加这些约束。那么它们是什么呢?让我们通过比较它的对应物来看一下。
抽象类与接口
正如您所知道的,这是继承的两个主要概念。
基本上,接口只是用来声明您愿意继承底层服务,仅此而已。不包含任何实现,也没有任何功能。从这个意义上说,接口是抽象的。这就是为什么它更像是一个设计约束而不是一个实现约束。想象一下扬声器上的耳机插孔。每个耳机都需要实现插孔接口(使用start、stop、listen、turnDown、turnUp方法)。每个头戴式耳机都应覆盖此接口以继承扬声器提供的功能并相应地实现。
另一方面,抽象类可以包含具有实现的方法。这是基本的区别,从这个意义上说,它可能会利用比接口更多的重用。此外,它们可能包含私有的、受保护的和非静态的字段,而这些字段不能通过接口实现。您可以强制子类使用抽象方法(那些没有实现的方法)来实现一些必备的功能。抽象类比接口更灵活。
当然,更不用说,在java中你只能扩展一个类,在那里你可以实现多个接口。
抽象类与常规类
那么为什么不使用常规的类呢?使用抽象类的好处是什么?这很简单。如果使用抽象类,就会强制核心功能由子类实现。作为一个开发人员,你不需要记住你应该实现基本的功能。这就是抽象类在常规类上施加设计约束的地方。另外,通过使类成为抽象的,可以避免意外创建(不完整的)类。
https://stackoverflow.com/questions/3182440
复制相似问题