抽象类中方法的extern,abstract和partial之间有什么区别?

时间:2011-04-12 18:13:34

标签: c# abstract-class

我正在编写一个抽象类,因为我想提供一些常用的方法,需要一些过于具体的方法,并允许一些方法“扩展”。遇到编译器错误后,我想知道是否有人可以解释 extern abstract partial 关键字之间的差异。他们的意思是什么,我应该在何时/何地使用它们?

5 个答案:

答案 0 :(得分:28)

extern不太可能是你想要使用的东西。这意味着该方法已实现,但在外部实现 - 通常用于您在定义外部代码中实现的方法的互操作场景中。

另一方面,

abstract意味着您要为方法定义API,但不提供实现。子类必须为标记为abstract的任何方法或属性提供实现,或者为abstract本身提供。如果要创建基类并且具有必须由子类实现的方法或属性,则需要使用abstract

partial类和方法仅仅是一种编译工具。它们允许您使用多个文件来定义类型。这主要用于自动生成的代码(即:设计人员将设计器生成的代码放入定义分部类的单独文件中,因此您可以“填写”缺失的部分而无需查看实现细节)。这不太可能直接用于定义类。

答案 1 :(得分:5)

extern方法通常是通过dll-import(P / Invoke)实现的 - 所以它确实有一个实现 - 你只是看不到它。

partial方法主要用于将代码生成作为向生成的代码注入功能的方法。它们是可选的,仅限私人,如果您提供另一半, 仅存在 。因此,在返回/输出值方面也存在一些限制,以确保明确分配。如果没有实现,编译器将完全省略对部分方法的调用。

abstract方法是必须由派生类型提供实现的方法。如果仍有未实现的抽象方法,运行时可确保您不能拥有实例,因此可以确保它们将在运行时存在。

答案 2 :(得分:4)

Extern将允许您通过dll-import使用方法,因此您对该方法赋予特殊含义,它来自外部来源

部分:

  1. 必须在部分类或部分类中声明部分方法 struct
  2. 您无法在“部分方法”
  3. 上拥有访问修饰符
  4. 部分方法不能具有访问修饰符或虚拟,抽象,覆盖,新建,密封或外部修饰符
  5. 部分方法在单独声明之前不能实现它。
  6. 部分方法只能定义,不能在同一个分类中声明。
  7. * 最重要的部分和抽象方法的区别是部分实现是可选的,但抽象方法的实现是强制性的*

    抽象方法严格要求在非抽象派生类

    中实现

    抽象方法的基本用法是,它们需要实现才能使用 该类,因为这些方法有助于有效地利用该类

答案 3 :(得分:3)

外部:http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx

将抽象(C#Reference)和extern修饰符一起用于修改同一成员是错误的。使用extern修饰符意味着该方法在C#代码之外实现,而使用abstract修饰符意味着该类中没有提供方法实现。

摘要:http://msdn.microsoft.com/en-us/library/sf985hc5%28v=vs.80%29.aspx

在类声明中使用abstract修饰符来指示一个类仅用于其他类的基类。标记为抽象或包含在抽象类中的成员必须由派生自抽象类的类实现。

部分:http://msdn.microsoft.com/en-us/library/wbx7zzdd%28v=vs.80%29.aspx

部分类型定义允许将类,结构或接口的定义拆分为多个文件。

答案 4 :(得分:1)

这里似乎有一些很好的答案,但我仍然会写得更清楚

外部

根据C#规范

当方法声明包含extern修饰符时,该方法被称为外部方法。外部方法通常是使用C#以外的语言在外部实现的。由于外部方法声明不提供任何实际实现,因此外部方法的方法主体仅由分号组成。外部方法可能不是通用的。 extern修饰符通常与DllImport属性结合使用,从而允许通过DLL(动态链接库)实现外部方法。执行环境可以支持其他机制,从而可以提供外部方法的实现。当外部方法包含DllImport属性时,方法声明还必须包含静态修饰符。 enter image description here

部分

部分方法的签名在部分类型的一部分中定义,其实现在类型的另一部分中定义。部分方法使类设计人员可以提供类似于事件处理程序的方法挂钩,开发人员可以决定是否实现。如果开发人员未提供实现,则编译器会在编译时删除签名。以下条件适用于部分方法:

  • 部分类型的两个部分中的签名必须匹配。
  • 该方法必须返回void。
  • 不允许使用访问修饰符。部分方法是隐式私有的。

以下示例显示了在部分类的两个部分中定义的部分方法:

enter image description here

摘要

在方法或属性声明中使用abstract修饰符表示该方法或属性不包含实现。

抽象方法具有以下功能:

  • 抽象方法隐式为虚拟方法。
  • 仅抽象类中允许使用抽象方法声明
  • 因为抽象方法声明没有提供实际的实现,所以没有方法主体;方法声明仅以分号结尾,并且签名后没有大括号({})。
  • 在抽象方法声明中使用静态或虚拟修饰符是错误的。

在此示例中,Square类必须提供Area的实现,因为它派生自ShapesClass:

enter image description here

Source

希望这有助于更好地理解,祝您编程愉快!