【发布时间】:2015-09-08 09:15:44
【问题描述】:
我已经开始了支持开发人员的职业生涯,但我梦想为软件开发人员找到一份工作。 我正在用 C# 学习 OOPS。经常困扰我的一件事是接口和抽象类的使用。何时使用接口,何时使用抽象类。我在谷歌上搜索这个主题,但无论我浏览什么答案,我看到所有人都试图解释什么是抽象和接口,但我不是在他们的定义之后,而是我想看看他们在现实世界程序中的实际用法。在这里我想强调一个使用接口的代码,但我认为完整的东西也可以用抽象类来设计。
参见下面使用接口的存储库设计模式代码 如果我将存储库公开为接口
public interface IEmployeeRepository
{
Employee[] GetAll();
}
那么优势将是我可以拥有尽可能多的实现,如下所示
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
}
}
参见上面的代码,它有一个合约方法GetAll()
以及谁会扩展接口,然后他们可以提供自己的实现。这是优势,但我的问题是我可以在这里写抽象类而不是接口吗?
假设我有一个抽象类
abstract class AbsEmployeeRepository
{
abstract public Employee[] GetAll();
}
现在我的所有其他存储库将扩展抽象类AbsEmployeeRepository
并重写函数GetAll() 以给出自己的实现。
现在的问题是抽象类是否可以解决我的目的,那么为什么在这种情况下我们需要接口。如果涉及多重继承,那么接口将是首选,否则我们可以使用抽象类完成工作。
寻找有价值的 cmets 和建议。谢谢
【问题讨论】:
-
CLR 本身就充满了例子。这是最真实的。
标签: c# oop interface abstract-class