在 C# 中何时使用抽象类以及何时使用接口 [重复]

Posted

技术标签:

【中文标题】在 C# 中何时使用抽象类以及何时使用接口 [重复]【英文标题】:When to use abstract classes and when to use interfaces in C# [duplicate] 【发布时间】:2011-04-02 02:53:28 【问题描述】:

可能的重复:Abstract classes vs InterfacesInterface vs Base class

嗨,

在 C# 中什么时候应该使用接口,什么时候应该使用抽象类? 请举例说明

【问题讨论】:

@BlaXpirit:关于是在方法开头还是在首次使用的地方声明变量的问题会证明 Java 是 C++ 的错误克隆吗?您的评论毫无意义的挑衅性,没有证据表明您的主要观点或您对 C# 的抨击是“坏的”。 @Bla 嗨,我从你推荐的问题中得到了答案。从技术上讲,我可以理解差异,当我使用抽象类时,我在派生类中重新使用基类代码。但是为什么我需要编写一个接口并实现它呢?无论如何,我将只在实现 hte 接口的类中定义方法。那么如果两个类实现了我写的接口,并在接口中定义了方法,那么即使我不写接口,我也能使用这些类和方法吗?那么我使用接口会获得什么优势呢? 在阅读之前的评论时,我的头开始疼。所以我会给你一个有用的链接,其中包含许多其他让你头疼的链接:duckduckgo.com/?q=interface+vs+abstract+class 【参考方案1】:

抽象类,如果你想实现基本功能和一些必须由实现者覆盖的属性/方法:

public abstract class Entity

     public int Id  get; set;

     public bool IsNew  get  return Id == 0;  

     public abstract DoSomething(int id); // must be implemented by concrete class

接口,如果你想定义,一个类必须包含哪些属性/方法,而不实现任何功能:

public interface IRepository

    object Get(int id);
    IEnumerable<object> GetAll();

【讨论】:

嗯...你会同时做这两个吗?请参阅***.com/questions/2705163/… 接受的答案。 这不满足用户要求.....【参考方案2】:

在描述合同时使用接口,而在实现将在派生类之间共享的功能时使用抽象类。

使用示例可以是template pattern 和Strategy pattern

【讨论】:

从技术上讲,我可以理解其中的区别,当我使用抽象类时,我在派生类中重用了基类代码。但是为什么我需要编写一个接口并实现它。无论如何,我将只在实现它的类中定义方法。那么如果两个类实现了我写的接口并在接口中定义了方法,那么即使我没有写正确的接口,我也可以使用这些类和方法吗?那么我使用接口会获得什么优势呢?

以上是关于在 C# 中何时使用抽象类以及何时使用接口 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中何时使用 mixins 以及何时使用接口?

我如何选择抽象类或接口..? [复制]

何时使用接口或抽象类?何时使用两者?

何时在 C# 中使用静态类 [重复]

为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]

您如何决定使用抽象类和接口? [复制]