C#中接口、抽象类、密封类、静态类和部分类的区别是什么?

16
在C#语言中,接口(Interface),抽象类(Abstract Class),密封类(Sealed Class),静态类(Static Class)和部分类(Partial Class)有何不同?这些类在VB.NET中是否都可用?

12
读一本书,或者 C# 的介绍。或者如果你很勇敢,可以读 ECMA 规范。 - leppie
2
@leppie - 在我看来,ECMA规范令人惊讶地易于理解。 - ChaosPandion
@ChaosPandion:是的,我同意,但对于不理解基本概念的新手来说不适合。 - leppie
2
@ChaosPandion 哈哈,我经常发现它比MSDN文档更简单 :) - nawfal
6个回答

47
  • 抽象类
    当存在一种 IS-A 关系且不允许从该抽象类创建实例时,应该使用抽象类。 例如:Animal 是一个抽象基类,可以派生出特定的动物,如 Horse、Pig 等。通过将 Animal 设为抽象类,就无法创建 Animal 实例。

  • 接口
    应该使用接口在类中实现某些功能。假设我们想要让 Horse 能够跳跃,就可以创建一个 IJumping 接口。将此接口添加到 Horse 中后,应该实现 IJumping 中的所有方法。在 IJumping 中仅定义声明(例如 StartJump 和 EndJump),在 Horse 中添加这两个方法的实现。

  • 密封类
    通过使 Horse 成为密封类,无法从中继承,例如制作希望从 Horse 继承的 Pony 或 WorkHorse 类。

  • 静态类
    通常用于“实用程序”函数。假设您需要一种计算一些数字平均值的方法以在 Horse 类中使用,但不想将其放在 Horse 类中,因为它与动物无关,也与其他类无关,您可以创建一个类来包含此类方法。不需要实例化这种类型的实用程序类。

  • 部分类
    部分类只是将类的文件分成多个较小的文件。这样做的原因可能是仅向其他人共享源代码的一部分。如果原因是文件变得太大,请先考虑将类分成较小的类。


1
非常优秀且非常简单。找不到比这更容易的了。非常感谢。 - Syed Md. Kamruzzaman

15
  • 接口:仅包含方法定义

  • 抽象类:部分方法有实现,部分方法为抽象(仅有方法定义)

  • 密封类:一个不允许继承的类

  • 静态类:仅包含静态方法的类(没有实例存在,所有方法可以在没有实例的情况下调用)

  • 局部类:一个在两个或更多不同模块的分离的类定义中定义的类。

是的,它们在C#和VB中都可用,尽管在某些情况下VB使用不同的关键字。


3

还有其他人点击了这个链接吗?它没有带我去任何与代码相关的东西...对我来说是一个相当淘气的链接,哈哈。 - fifamaniac04
1
@fifamaniac04:非常抱歉,链接已经更改。我已经更新了链接。现在您应该能够看到那篇帖子了。 - Sumit

2
以下是抽象类和接口的区别:
  1. 抽象类既有方法声明也有方法定义,而接口只有方法声明。

  2. 抽象类被称为部分抽象类,而接口被称为完全抽象类。

  3. 子类继承抽象类的特性,而实现类必须实现接口的特性。

  4. 抽象类支持访问控制符,而接口不支持。

  5. 抽象类既有普通变量又有常量变量,而接口没有变量。

  6. 我们可以在抽象类中编写构造函数,而在接口中却不能。


接口不支持访问修饰符。我显式地使用了 internal 和默认的 public。 - priyanka.sarkar

2

一个普通的类可以在运行时实例化,形成一个具有字段(字段是属性、函数、事件等)的对象。一个普通的类也可以被继承或子类化。

添加额外的关键字会改变类的工作方式。

  • 添加 public, private, protected 会改变其他代码看到和使用这个类的方式。
  • static 添加到类中意味着您不能使用 new 关键字创建实例,但只能通过静态函数访问它。例如:String.IsNullOrEmpty()
  • sealed 添加到类中意味着没有其他类可以继承“sealed”类。

接口是一种“契约”,表示实现类将提供某些功能。 IDisposable 接口表示所有实现它的类都将具有一个 Dispose 函数。


0
在抽象类中,可以提供更多的功能而不影响子类。在接口中,如果我们添加任何方法到接口中,则会影响所有的子类。

1
我认为你应该详细阐述你的帖子,以确保它为OP提供了适当的答案。请还要查看我们的常见问题解答:http://stackoverflow.com/faq。祝好运。 - ForceMagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接