我们可以使用Abstract类代替接口吗

1 c# oop abstract-class interface

我已经开始担任支持开发人员的职业,但我梦想着为S / W开发人员找到一份工作。我正在用C#学习OOPS。通常让我烦恼的一件事是接口和抽象类的用法。何时使用接口以及何时使用抽象类。我在这个主题上搜索了google,但是无论浏览什么答案,我都看到所有人都在尝试解释什么是抽象和接口,但是我不是按照他们的定义,而是希望看到它们在实际程序中的实际用法。在这里,我想强调一个使用接口的代码,但我认为全部内容也可以使用抽象类进行设计。

如果我将存储库公开为接口,请参见下面的存储库设计模式代码,其中已使用接口

public interface IEmployeeRepository
{
    Employee[] GetAll();
}
Run Code Online (Sandbox Code Playgroud)

那么优势将是我可以有如下所示的多种实现

public class EmployeeRepositoryEF: IEmployeeRepository
{
    public Employee[] GetAll()
    {
        //here you will return employees after querying your EF DbContext
    }
}

public class EmployeeRepositoryXML: IEmployeeRepository
{
    public Employee[] GetAll()
    {
        //here you will return employees after querying an XML file
    }
}

public class EmployeeRepositoryWCF: IEmployeeRepository
{
    public Employee[] GetAll()
    {
        //here you will return employees after querying some remote WCF service
    }
}
Run Code Online (Sandbox Code Playgroud)

请参见上面的代码,该代码具有一个协定方法,GetAll() 并且谁将扩展接口,然后他们可以提供自己的实现。那是优点,但是我的问题是我可以在这里写抽象类而不是接口吗?

假设我有一个抽象类

abstract class AbsEmployeeRepository
{ 
   abstract public Employee[] GetAll(); 
}
Run Code Online (Sandbox Code Playgroud)

现在我所有其他的存储库将扩展抽象类 AbsEmployeeRepository

并覆盖该函数GetAll()以提供自己的实现。

现在的问题是抽象类是否可以解决我的目的,那么为什么在这种情况下我们需要接口。在考虑多重继承的情况下,接口将是首选,否则我们可以使用抽象类完成工作。

寻找有价值的意见和建议。谢谢

小智 5

你可以使用一个抽象类,当你有

  • 要共享的代码。
  • 方法的默认行为,但希望类的用户能够覆盖它。

你可以使用一个接口

  • 没有共享代码。
  • 它需要应用于没有通用基类的许多对象。
  • 使公共方法的定义更清晰并提供文档。
  • 您希望源代码是私有的。

通常,您将抽象类(用于共享代码)和接口(用于文档)一起使用。