8

我一直在阅读 Programming Microsoft® Visual C#® 2008: The Language 以更好地理解 C# 以及可以用它做什么。我遇到了我已经从 ASP.Net 的 Page 类中遇到的部分类。

对我来说,您似乎可以使用抽象类和覆盖类来完成部分类的工作。显然,一个团队将通过抽象方法控制接口,但无论如何你都会相互依赖。如果目标是协作,那么源代码控制和其他工具就不能解决这个问题。

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

4

8 回答 8

21

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

于 2009-06-29T11:40:34.153 回答
4

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

于 2009-06-29T11:40:44.013 回答
4

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

这里有一个关于为您生成的 Linq to SQL 类的想法。它们是自动生成的,这意味着您不应修改它们。没有分部类,就不能附加接口。您可以创建一个新类并从 Linq to sql 类派生该类,但这实际上并没有为您带来任何好处,因为您无法使用接口将 linq to sql 类向上转换到您的类。

于 2009-06-29T11:46:06.703 回答
2

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

如果你有一个大班,那已经错了。代码应该被重构为多个“真实”类而不是多个文件。大类通常表示该类做的事情太多,违反了 SRP(单一职责原则)。

于 2011-04-07T16:03:06.543 回答
1

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

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

在 example.aspx.cs

private object GetProperty(){ // called from aspx
    return DateTime.Now;
}

private void DoStuff(){
    ExampleControl c = exampleCntr; //exampleCntr is defined in aspx.
}

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

于 2009-06-29T12:39:36.813 回答
1

听起来你的问题是有什么区别

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

astract class FooBase
{
  PART ONE
}
partial class Foo : FooBase
{
  PART TWO
}

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

-1- 该类型FooBase可能必须知道应该从它派生的具体类型的身份,并且始终使用该类型的变量,而不是 type FooBase。这代表了这两种类型之间的一种令人不安的紧密耦合。

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

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

于 2013-06-16T20:59:39.357 回答
0

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

于 2009-06-29T11:41:48.677 回答
0

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

于 2009-06-29T11:44:51.103 回答