C# 使用分部类相对于抽象类有什么好处?

C# 使用分部类相对于抽象类有什么好处?,c#,class,abstract-class,partial-classes,C#,Class,Abstract Class,Partial Classes,我一直在阅读编程Microsoft®Visual C#2008:更好地理解C#以及如何使用它的语言。我遇到了ASP.Net的Page类中已经遇到的部分类 在我看来,似乎可以像分部类那样处理抽象类和重写类。显然,一个团队将通过抽象方法控制接口,但无论如何,您将相互依赖。如果目标是协作,那么这不是源代码管理和其他工具解决的问题吗 我只是错过了部分课程的要点。也可以有人提供一个真实的世界使用 部分类与对象继承无关。分部类只是将定义类的源代码拆分为单独文件的一种方式(例如,当您在Windows窗体应用程

我一直在阅读编程Microsoft®Visual C#2008:更好地理解C#以及如何使用它的语言。我遇到了ASP.Net的Page类中已经遇到的部分类

在我看来,似乎可以像分部类那样处理抽象类和重写类。显然,一个团队将通过抽象方法控制接口,但无论如何,您将相互依赖。如果目标是协作,那么这不是源代码管理和其他工具解决的问题吗


我只是错过了部分课程的要点。也可以有人提供一个真实的世界使用

部分类与对象继承无关。分部类只是将定义类的源代码拆分为单独文件的一种方式(例如,当您在Windows窗体应用程序中创建新窗体时,可以这样做-一个文件是“您的”代码,另一个文件。designer.cs包含VS2008为您管理的代码).

一个好的用法示例是生成分部类的一侧(如ORM)

分部类的目的是允许一个类的定义跨越多个文件。这样可以更好地维护和分离代码。

我们使用分部类来分割更大的类。这样,使用Sourcesafe检查部分代码就更容易了。这就限制了四个开发人员需要访问同一个文件的情况。

分部类的好处在于,您可以获取现有类并将其添加到该类中。这听起来很像继承,但是继承有很多事情做不到,而分部类可以做到

以下是为您生成的Linq到SQL类。它们是自动生成的,这意味着您不应该修改它们。如果没有分部类,则无法附加接口。
您可以创建一个新类,并从Linq到sql类派生它,但是这并不能给您带来任何好处,因为您无法使用接口将linq to sql类升级到您的类。

部分类现在在ASP.Net中大量使用,允许使用两个源文件,即基于标记的example.aspx和基于代码的example.aspx.cs,以便每个文件中定义的方法和变量对每个文件都可见。 在example.aspx中

<custom:exampleControl id="exampleCntr" property="<%#getProperty()%>" />

这种双向性不能用抽象类重新创建。

部分类应限制与自动生成的代码一起使用,而其他代码不能修改。使用它代替继承或添加功能不是最佳实践


如果你有一个大班,它已经错了。代码应该重构成多个“真实”类,而不是多个文件。大班通常意味着班级做了太多的事情,违反了SRP(单一责任原则)。

听起来你的问题是他们之间的区别是什么

partial class Foo
{
  PART ONE
}
partial class Foo
{
  PART TWO
}

虽然它们可能看起来有些相似,并且在某些情况下可以使用后一种构造来代替前一种构造,但后一种样式至少存在两个问题:

-1-类型
FooBase
可能必须知道应该从中派生的具体类型的标识,并且始终使用该类型的变量,而不是
FooBase
类型的变量。这表示这两种类型之间存在令人不安的紧密耦合

-2-如果类型
Foo
是公共的,那么类型
FooBase
也必须是公共的。即使
FooBase
的所有构造函数都是
internal
,外部代码也可以定义从
FooBase
派生的类,而不是
Foo
;构建此类类的实例将是困难的,但并非不可能


如果派生类型可以扩展基类型的可见性,那么这些问题就不会太麻烦;人们会将
FooBase
视为一个“一次性”标识符,它会出现两次:一次出现在其声明中,一次出现在
Foo
的声明行中,并认为每个
FooBase
都会伪装成一个
Foo
。如果没有类型转换,
FooBase
不能在
this
上使用
Foo
实例成员,这一事实可能会令人厌烦,但也可能会鼓励对代码进行良好的分区。但是,由于不可能扩展基类型的可见性,抽象类设计似乎令人讨厌。

我知道它与继承无关,但您可以做同样的事情,因为它是继承的一种副作用,您可以将代码拆分为单独的文件。不过,可能没有分部类提供的那么好或干净。我只是想给它们找个用途。哦,对不起。我打字太快了。那么最终,设计器代码和您的代码将在同一个文件中结束?如果是这样的话,现在我看到了它的用途。但我可能永远不会使用它,除非我尝试做类似的事情。他们做的事情与继承完全不同。VisualStudio就是一个例子。表单生成器使用设置控件的代码生成部分类文件。用户代码保存在单独的文件中。编译时,这些文件合并到一个类中。分部类的真正杀手级应用是生成部分但不是全部由生成代码组成的类。您可以使用(例如)O/R映射器执行类似的操作。是的,编译器将这些单独的文件视为单个类定义(我想您可以想象,在编译之前,它会将它们合并到内存中的单个文件中)。然而,抽象类有点像其他类的“模板”,因为它的定义是完整的,但实现不是完整的。但是,如果愿意,抽象类也可以实现为分部类
partial class Foo
{
  PART ONE
}
partial class Foo
{
  PART TWO
}
astract class FooBase
{
  PART ONE
}
partial class Foo : FooBase
{
  PART TWO
}