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

可能的重复:
Abstract classes vs Interfaces
Interface vs Base class

嗨,

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

【问题讨论】:

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

标签: c# interface 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();
}

【讨论】:

【解决方案2】:

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

使用示例可以是template patternStrategy pattern

【讨论】:

  • 从技术上讲,我可以理解其中的区别,当我使用抽象类时,我在派生类中重用了基类代码。但是为什么我需要编写一个接口并实现它。无论如何,我将只在实现它的类中定义方法。那么如果两个类实现了我写的接口并在接口中定义了方法,那么即使我没有写正确的接口,我也可以使用这些类和方法吗?那么我使用接口会获得什么优势呢?
猜你喜欢
  • 2011-06-25
  • 2012-03-26
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2010-11-16
  • 2015-02-15
相关资源
最近更新 更多