4

在一次采访中,有人要求我证明什么时候选择接口,什么时候选择抽象类,以及在什么情况下你会从这两个中选择一个......我已经提出了我对接口的分析,那就是......

接口是类型声明或定义多方合同的最佳选择。如果多个程序员在一个项目的不同模块中工作,他们仍然通过定义接口而不是等待实际实现准备好来使用彼此的 API。

这为我们在编码和开发方面带来了很大的灵活性和速度。使用接口还可以确保最佳实践,例如“为接口编程而不是实现”,并产生更灵活和可维护的代码。

但是我没有充分的理由来证明抽象类的合理性,请指教..!

4

7 回答 7

30

抽象类用于将多个具体类组合在一个实体下。

例如,以抽象类为例Animal。动物不是具体的东西。这是一个动物家族。但它们都有某些共同点,例如,每个都有一个speak()选项(好吧,除了 fish 和 sort)。但每个人都以不同的方式实现它。通过这种方式,您可以仅覆盖不同的方法,例如sleep() or breath()常见的方法(再次,鱼是不同的 :))。

另一方面,接口是“动作”的更直接定义。这就是为什么 Java 中的大多数(如果不是全部)接口都以“able”(Comprable、Serializable...)结尾. 例如,一条狗不是 Animable。

基本上,总结起来,我认为最好的定义就是这个。当你有一个类A is kind of B和接口时使用抽象类A can do B

希望这会有所帮助。

于 2012-08-09T18:31:03.760 回答
5

当您想要提供部分实现时使用抽象类。

于 2012-08-09T18:22:35.357 回答
2
  • 如果需要,抽象类可以具有默认行为(实现),接口不能。

  • 抽象类可以为所有方法或没有方法提供默认行为,而接口则不能。

  • 抽象类可以与所有子类共享状态,接口不指定状态。

  • 您可以实现多个接口,您只能扩展一个(抽象)类。

于 2012-08-09T18:26:00.687 回答
1

接口声明与实现它的任何东西的合同。这是保证类将包含接口中的方法。

抽象类的相似之处在于它的任何子类也必须实现抽象方法,但您也可以拥有包含代码的工作方法。

我在 Android 编程中经常使用接口进行回调。如果我有很多类似的数据要显示并且只想对实现进行小的更改,我会使用很多抽象类。使用抽象类来减少重复代码,同时仍然有不同的实现。

于 2012-08-09T18:23:34.043 回答
1

您对接口的定义是正确的。

抽象类应该服务于完全不同的目的。例如,假设您正在为动物模拟器实现几个类。'Animal' 定义了几种行为,这些行为可能已经有了基本的实现,但它本身并不是可以实例化的东西。'Mamal' 也是如此,它是 'Animal' 的一个 bubclass。只有一个子类'Tiger'不会是抽象的,但是老虎所做的大部分不是特定于老虎的事情都会在它的抽象超类中实现。

于 2012-08-09T18:26:30.860 回答
1

1.一般来说,Abstract class 当我们需要强制关闭 Sub-Class from Super-Class的某些功能时,需要 An ,让子类可以灵活地添加其他功能。

例如:

Let Car be the Abstract Super-Class, which has 4 Tyres, 1 Steering ,etc...

Now the Sub classes like Santro i10, Maruti-800, Mahindr Bolero etc are Sub classes, but they need to have 4 Tyres, 1 Steering to be called a car, not they can have a radio or not as an additional feature.

2. Interface是在java中引入的,因为没有Multiple Inheritance。

3. Interface更多的是关于提供一个 role.

例如:

Let Dog be the Super-Class.

Wild Dogs and Pet Dogs are Sub-Classes.

Wild Behavior and Pet Behavior are Interfaces

Now as both Wild Dog and Pet Dog are dogs, but with different behavious. Then they must implement the Wild Behavior or Pet Behavior respectively

于 2012-08-09T18:35:38.007 回答
0

当您希望您的类仅在情况需要时实现方法时,您会想要使用抽象类。

一个例子是,如果您有一辆超级汽车,并且您希望您的子级别有车轮的话,他们可以为您提供多个车轮。如果它们是船,您将不需要它们,因此合同将强制您仍然执行,而您可以直接忽略抽象类。

于 2013-07-24T01:55:29.597 回答