abstract class和interface有什么区别(一)

本文探讨了在软件设计中选择接口或抽象类作为组件交互的基础时的考量因素。包括多态性的实现方式、抽象级别的差异及如何根据组件的版本管理和功能复用来做出合适的选择。

选择将功能设计为接口还是抽象类(在 Visual Basic 中为 MustInherit 类)有时是一件困难的事。“抽象类”是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通 用功能。有关详细信息,请参阅抽象类。

相反,“接口”是完全抽象的成员集合,可以被看作是为操作定义合同。接口的实现完全留给开发者去做。

接口和抽象类对组件交互都很有用。如果一个方法要求一个参数形式的接口,则任何实现该接口的对象都可以用在该参数中。例如:

' Visual Basic
Public Sub Spin (ByVal widget As IWidget)

// C#
public void Spin (IWidget widget)
此方法可以接受任何将 IWidget 实现为小部件参数的对象,即使 IWidget 的实现可能相差很大。抽象类也允许这种多态性,但须注意以下几点:

类可能只是从一个基类继承,所以如果要使用抽象类为一组类提供多态性,这些类必须都是从那个类继承的。
抽象类还可能提供已实现的成员。因此,可以用抽象类确保特定数量的相同功能,但不能用接口这样做。
这里是一些建议,帮助您决定使用接口还是抽象类为组件提供多态性。

如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

 

 

在编程中,`abstract class`(抽象类)`interface`(接口)都是用来实现抽象级别的不同方式,它们可以用于定义共享的行为规范,但它们之间存在些关键区别: 1. **实现方式**: - `abstract class`:可以包含具体的方法实现(非抽象方法),也可以定义抽象方法。抽象类可以有构造器。 - `interface`:只能定义方法声明、常量、默认方法(Java 8及以上版本)静态方法(Java 8及以上版本)。接口中不能包含实例变量。 2. **多重实现**: - `abstract class`:个类可以继承个抽象类。 - `interface`:个类可以实现多个接口。 3. **成员可见性**: - `abstract class`:成员的可见性可以是 `private`、`protected`、`public`。 - `interface`:接口中的方法默认是 `public` 的,成员变量默认是 `public static final` 的,即常量。 **举例**: ```java // 抽象类示例 abstract class Animal { public abstract void makeSound(); // 抽象类可以有非抽象方法 public void eat() { System.out.println("This animal eats food."); } } // 接口示例 interface Flying { void fly(); } // 实现类,继承抽象类 class Bird extends Animal { @Override public void makeSound() { System.out.println("Birds make a chirp sound."); } } // 实现类,实现接口 class Airplane implements Flying { @Override public void fly() { System.out.println("Airplanes fly with jet engines."); } } ``` 在这个例子中,`Animal`是个抽象类,它定义了个抽象方法`makeSound`个非抽象方法`eat`。`Bird`类继承了`Animal`类,并提供了`makeSound`方法的具体实现。 `Flying`是个接口,它定义了个抽象方法`fly`。`Airplane`类实现了`Flying`接口,并提供了`fly`方法的具体实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值