在一次采访中,有人要求我证明何时选择界面以及何时选择抽象类以及在哪种情况下你将从两个中选择一个..我已经提出了我的界面分析,那就是...
接口是Type声明或定义合约的最佳选择 多方之间。 如果多个程序员在项目的不同模块中工作,他们仍然通过定义接口而不是等待来使用彼此的API 实际实施准备就绪。
这为我们带来了很多编码和灵活性方面的灵活性和速度 发展。使用Interface还可以确保最佳实践 “为接口编程而不是实现”并导致更多 灵活且可维护的代码。
但是我没有充分的理由来证明抽象类的合理性,请指教..!
答案 0 :(得分:24)
抽象类用于在一个实体下对许多具体类进行分组。
例如,采用抽象类Animal
。
动物不是具体的东西。它是一群动物。但它们都共享某些aspectes,例如,每个都有一个speak()
选项(好吧,除了鱼和排序)。但每一个都以不同的方式实现它这样你只能覆盖不同的方法,例如sleep() or breath()
是常见的(再次,鱼是不同的:) :)。
另一方面,接口更直接地定义了“动作”。这就是为什么Java中的大多数(如果不是全部)接口都以'able'结束(Comprable,Serializable ......) 通过实现接口,您告诉其他程序员或曾经使用过您的代码的人,这个类可以做到这一点。 例如,狗不是,Animable。
基本上,总结一下,我认为最好的定义就是这个。
当您拥有A is kind of B
的类并在A can do B
时接口时使用抽象类。
希望有帮助。
答案 1 :(得分:5)
当您想要提供部分实现时,使用抽象类。
答案 2 :(得分:2)
如果需要,抽象类可以有默认行为(实现),接口不能。
抽象类可以为所有方法提供默认行为,也可以不提供方法,而接口则不能。
抽象类可以与所有子类共享状态,接口不指定状态。
您可以实现多个接口,只能扩展一个(抽象)类。
答案 3 :(得分:1)
接口声明与实现它的任何合同。它保证了类将包含接口中的方法。
抽象类是类似的,因为它的子类也必须实现抽象方法,但你也可以使用包含代码的工作方法。
我使用接口进行Android编程的回调。如果我要显示很多类似的数据并且只想对实现进行小的更改,那么我会使用很多抽象类。使用抽象类来减少重复的代码,同时仍然有不同的实现。
答案 4 :(得分:1)
您对接口的定义是正确的。
抽象类应该用于完全不同的目的。举个例子,我们假设您正在为动物模拟器实现几个类。 '动物'定义了几个可能已经具有基本实现的行为,但本身并不是实例化的有意义的行为。同样对于Mamal',一个' Animal'的泡泡。只有一个子类' Tiger'不会是抽象的,但是大多数老虎所做的事情并不是特定于老虎的,它将在它的抽象超类中实现。
答案 5 :(得分:0)
1。一般来说,当我们需要强制执行 Abstract class
上的某些功能时,我们需要Sub-Class
来自 Super-Class
,让子类可以灵活地添加其他功能。
<强>例如强>
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中引入的,因为没有多重继承。
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
答案 6 :(得分:0)
当你希望你的类只实现这些方法时,你想要使用一个抽象类。
一个例子就是如果你有一个超级级车辆,并且你希望你的子类能够为你提供多少轮子。如果它们是船只你就不需要它们,所以合同会迫使你实施,而你可以直接忽略它为你的抽象类。