C# C语言中的继承与接口#

C# C语言中的继承与接口#,c#,inheritance,interface,C#,Inheritance,Interface,可能的重复项: 因此,我正在用C#编写我的第一个真正的程序。该程序将从四个不同的网站上搜集数据。我的计划是让一个父类看起来像这样: class Scraper { string scrapeDate(url); string scrapeTime(url); //&c. } 然后我将有四个从中继承的类 另一个选项是使Scraper成为一个接口,并有四个类来实现它 这些方法之间有什么区别?接口只包含方法、委托或事件的签名。方法的实现在实现接口的类中完成 一个类

可能的重复项:

因此,我正在用C#编写我的第一个真正的程序。该程序将从四个不同的网站上搜集数据。我的计划是让一个父类看起来像这样:

class Scraper
{
    string scrapeDate(url);
    string scrapeTime(url);
    //&c.
}
然后我将有四个从中继承的类

另一个选项是使
Scraper
成为一个接口,并有四个类来实现它


这些方法之间有什么区别?

接口只包含方法、委托或事件的签名。方法的实现在实现接口的类中完成

一个类可以实现多个接口


一个类只能有一个直接基类。

如果您有公共功能,则应使用继承-该功能将在所有子类中可用,并且每个子类都可以扩展或重写父类代码

如果有什么东西在使用类,您可以使用接口来确保所有类实现相同的方法和属性,但不一定实现相同的功能。

主要区别:

  • 接口根本没有实现,而抽象基类可以实现公共功能
  • 一个类只能从一个基类继承,但它可以实现多个接口
在您的情况下,您的所有scraper类可能都需要一些公共特性,因此让它们都从引用的公共基类继承是有意义的

有一些相似之处和不足之处 接口和 抽象类:

一个类可以实现几个 接口。
一个类只能继承一个抽象 班级

接口不能提供任何代码, 只有签名。
抽象类可以提供 完整的默认代码和/或仅为 必须覆盖的详细信息

接口不能具有访问权限 子节点、函数、, 财产等一切都是假定的 作为公众
抽象类可以包含访问权限 子节点、函数、, 性质

接口用于定义 一个班级的外围能力。在里面 换句话说,人和车辆都可以 从IMovable接口继承。
抽象类定义了核心 类的标识,它就在那里 用于相同类型的对象

如果各种实现只共享 方法签名,那么最好 使用接口。
如果不同 实现是同类的 使用普通行为或身份 那么,最好使用抽象类

如果我们向接口添加一个新方法 然后我们必须找到所有的 接口的实现和 定义新系统的实现 方法。
如果我们将一个新方法添加到 抽象类,那么我们可以选择 提供默认实现的方法 因此,所有现有的代码 可能会正常工作

无法在接口中定义任何字段
抽象类可以有字段和 定义的合同


您在这里看到的东西实际上是最好的接口。如果您想要包含一些公共逻辑,或者想要包含一些公共数据成员,那么您将使用基类并从中继承。您所做的是要求每个子级实现一组最小的逻辑。

类继承表示一种“is-a”关系,例如,
坦克
车辆
。如果您的情况至少不符合这一点,请选择接口而不是继承

如果建议的基类没有为方法提供默认实现,这将是选择接口而不是继承的另一个原因

在C#中,只能从一个类继承,但可以从多个接口继承。这将是选择接口而不是继承的另一个原因


明白了吗?

接口允许定义常见行为的结构

如果可以提取一个或多个特定行为的通用实现,则继承非常有用

基本上,如果几个类以相同的方式刮取一个日期,那么将刮取日期放在基类中是有意义的;否则,只使用一个接口,并在实现接口的每个类中定义特定的日期。

老实说,两者都要做

public interface IScraper
{
  string ScrapeDate(string url);
}

public abstract class Scraper : IScraper
{
  public string ScrapeDate(string url)
  {
    // default implementation
  }
}
无论哪种方式都有好处,但如果不了解更多需求,这些好处很难量化。然而,没有理由你不能两者兼得。为您的类提供一个接口也可以使其出于测试目的进行模拟


<>别的事情要考虑;如果每个派生类的功能都非常相似,那么简单地使用一个类来获取构造函数的参数可能会更容易。

在我看来,如果可能的话,继承是更好的方法。在基类中实现公共特性有助于确保底层实现的一致性,而实现接口只保证接口的一致性。只要有可能,继承就是OOP三脚架的一条腿,并限制代码重复

当我的对象不能或不应该有公共基类,但需要提供类似功能时,我使用接口。实现公共接口的类可能(而且可能确实)公开额外的功能,可能实现多个接口,等等

例如:在一个应用程序中,我的数据访问层是围绕“提供者”类构建的,它将业务对象和数据库代理对象与数据库隔离开来。在一个实例中,我有一个与SQL Server数据库交互的提供者,另一个用于按需与Oracle CRM通信(又名Why God Why)。两者都实现了一个不可知的接口,这样客户机代码就不关心它处理的是哪个数据存储