当前位置: 首页 > 面试题库 >

抽象类与所有方法的抽象和接口之间的区别?

从景曜
2023-03-14
问题内容

我接受了一次采访,面试官首先问我抽象类与所有抽象方法和接口之间的区别是什么。

我回答说,如果将来需要继承某些东西,并且已经扩展了一个类,那么您将无法做到这一点。

然后,他说,在这种情况下,您将永远不必扩展任何其他课程,而您必须执行合同。在这种情况下,最好使用抽象类或接口?

我告诉他您可以使用其中任何一个,但他并不满意。我不明白为什么-我认为这是开发人员/设计的选择。


问题答案:

表示接口代表合同的答案是不可接受的。这就是我们给Junior的答案,因为它可能太复杂而无法清楚地了解抽象类的本质与接口的本质之间的区别,而无需太多的架构经验,也无需阅读大量经典书籍。任何带有public方法的抽象类都充当协定和接口。

不提供任何实现的抽象类在99%的情况下表示对象Role
一个 接口 表示 角色
每个对象可能具有多个不同的角色,这些角色不应捆绑在一起,而应由相关的对象组成。

我在这个例子中解释这个

您的面试官可能会说:
我也有Robot可以走路的东西Human,也可以走路的东西。

因此,基于这种情况,他问你:我是否应该在知道实现没有共同点的情况下,在抽象基类或接口中提取步行功能?

您认为……“哦,我知道:在这种情况下,拥有一个具有抽象方法的抽象类,walk()显然与声明该walk()方法的接口相同。”
因此,您的答案肯定是:“这是开发人员的选择!”。
这确实不是一个始终有效的答案。

为什么?让我们看看下一个期望:
A Human可以吃,但是显然Robot不能甚至不需要。

如果您用抽象类实现了步行功能怎么办?您最终将得到:

public abstract class Biped {  
  public void abstract walk();
}

public Robot extends Biped {
   public void walk() {
     //walk at 10km/h speed
   }
}

public Human extends Biped {
   public void walk() {
     //walk at 5km/h speed
   }
}

您如何才能插入该eating功能?您之所以陷入困境是因为您无法在Biped基类中实现它,因为它会破坏 Liskov替换原理 ,因为a
Robot不会吃!而且,Human由于已知的Java规则,您不能期望扩展另一个基类。

当然,您可以添加仅专用于Human的特定Feedable接口:

public interface Feedable {
  void eat();
}

签名变为:public Human extends Biped implements Feedable { 显然,让一个 角色
通过一个类来实现而另一个 角色 通过接口来实现是没有任何意义和混乱的。

这就是为什么只要有选择,就真正优选从接口开始。

通过一个界面,我们可以轻松地对 角色 进行建模。

因此,最终的解决方案将是:

public interface Walkable {
   void abstract walk();
}

public interface Feedable {
   void eat();
}

public Robot implements Walkable {
   public void walk() {
     //walk at 10km/h speed
   }
}

public Human implements Walkable, Feedable {
   public void walk() {
     //walk at 5km/h speed
   }

   public void eat(){
     //...
   }    
}

它不会提醒您 接口隔离原则 吗?;)

综上所述,如果您指定 IS-A 关系,请使用抽象类。如果您意识到要建模一个 角色 (假设是 IS-CAPABLE-OF
关系),请使用interface。



 类似资料:
  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗

  • 问题内容: 我不清楚两者之间的区别。 谢谢 问题答案: 它们非常相似,但是存在一些重要的技术差异: 抽象类允许您为某些方法提供默认的实现,但是接口不允许您提供任何实现。 您可以实现多个接口,但只能从一个抽象类继承。 这些差异影响应使用两种技术的方式: 您应该使用接口来 定义合同 。 抽象类对于 重用代码 很有 用 ……但是请注意,它不是重用代码的唯一方法。您还应该考虑其他方法,例如遏制。

  • 问题内容: Python中的抽象类和接口有什么区别? 问题答案: 有时您会看到以下内容: 因为Python没有(也不需要)正式的Interface协定,所以抽象和接口之间不存在Java风格的区别。如果有人努力定义一个正式的接口,它也将是一个抽象类。唯一的区别在于文档字符串中所述的意图。 当您进行鸭类输入时,抽象和接口之间的区别是令人不解的事情。 Java使用接口是因为它没有多重继承。 由于Pyth

  • 本文向大家介绍C++ 抽象类和接口的区别?相关面试题,主要包含被问及C++ 抽象类和接口的区别?时的应答技巧和注意事项,需要的朋友参考一下 类型 abstract class Interface 定义 abstract class关键字 Interface关键字 继承 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 接口只可以继承接口(一个或多个);子类可以实现多个接口 访问修饰符

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。

  • 本文向大家介绍C#程序中抽象类和接口之间的区别,包括了C#程序中抽象类和接口之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,C#和Java一样,都是面向对象的程序设计,并且为诸如封装,抽象,继承和多态性等面向对象的概念提供全面支持。 与抽象相反,抽象类和接口都以图片形式出现,因为它们都在C#程序中提供了抽象。 在抽象类中,我们可以创建需要由派生类实现的功能。接口允许我们定义一个或多个