接口和仅具有一个抽象方法的抽象类之间有什么区别? - c#

This question already has answers here:

Closed 7 years ago.

Possible Duplicate:
When to use an interface instead of an abstract class and vice versa?
Interface vs Abstract Class (general OO)

我有

public interface MyInterface
{
  void Execute();
}

public abstract class MyAbstractClass
{
  public abstract void Execute();
}

现在,当一个类将它们实现时,抽象类和接口之间会有什么区别?当一个抽象类只有一个抽象方法时,一个类何时实现它们的原因是什么?

这个问题是昨天在一次采访中问我的。

提前致谢

参考方案

即使这是重复的,我也会尝试为您澄清一下:

现在,当一个类将它们实现时,抽象类和接口之间会有什么区别?

如果使用抽象类,则不同之处在于,您需要从抽象类继承,然后重写抽象方法。

如果使用接口,则需要实现该方法而不继承该类,从而在需要时可以灵活地从另一个类继承

当一个抽象类只有一个抽象方法时,一个类何时实现它们的原因是什么?

不要考虑要在一种方法之间进行选择的方法的数量,而要考虑在将一种方法与另一种方法进行比较时所要取得的取舍。

如果决定使用抽象类,则派生类将必须继承抽象类才能起作用,并且由于只能从C#中的一个类继承,因此您将严格限制抽象类。
如果实现接口,则可以从另一个类层次结构继承,换句话说,使用接口将为您提供最灵活的设计

现在,当您要编写子类将继承的基本代码时,抽象类非常有用,在这种情况下,您可以在子类中有效地重用抽象类中编写的代码,从而在子类中编写更少的代码。您还可以重写抽象方法以提供自己的实现

接口实现和通用功能 - c#

我有以下要求,将有2个(或更多)不同的类来执行相同类型的操作(以不同的方式)。因此,我决定创建一个接口。然后,用我的界面实现了这两个类。现在,从另一个类中,我将使用接口类型的对象并调用函数。一切正常。然后出现了一个新要求,即创建适用于两个类的通用功能。我不想在两个类中定义相同的函数。和接口不允许功能定义。首先,我认为抽象类会很有用。因为它允许函数定义和抽象函…

方法链PHP OOP - php

通常,在许多框架中,您可以找到使用查询生成器创建查询的示例。通常您会看到:$query->select('field'); $query->from('entity'); 但是,在某些框架中,您也可以像这样$object->select('field') ->from(�…

如何从jar文件创建C库? - java

我有一个图书馆的jar文件,其中的内容是一堆.class文件spl ├── acm │   ├── graphics │   │   ├── DrawLineElement.class │   │   ├── EndRegionElement.class │   │   ├── FinalPathElement.class │   │   ├── G3DRe…

OOP:upcast与直接实例化 - java

我正在准备加入SCJP,看起来我不了解类强制转换原则。class Dog extends Animal 创建Dog()实例的第一种方法-制作Animal实例并将其投放到Dog(upcast):Animal a = new Dog(); Dog d1 = (Dog)a; VS创建Dog()实例的第二种方法-直接进行创建:Dog d2 = new Dog(); …

用两个接口声明变量 - java

是否有一些“最佳实践”如何声明一个实现两个接口的变量?假设您的方法需要一个对象来同时实现InterfaceA和InterfaceB。void doSomething( BOTH_INTERFACES argument) { ... } 您认为实现或模拟此效果的最佳方法是什么?我想到创建一个组合界面interface InterfaceAB extends I…