使用部分类而不是抽象类有什么好处?

时间:2009-06-29 11:37:32

标签: c# class abstract-class partial-classes

我一直在阅读编程Microsoft®VisualC#®2008:语言,以便更好地理解C#以及可以用它做些什么。我遇到过从ASP.Net的Page class中遇到的部分类。

对我来说,似乎你可以用抽象类和被覆盖的类来做部分类。显然,一个团队将通过抽象方法控制界面,但无论如何你都会相互依赖。如果目标是协作,则不是源控制和其他工具解决的问题。

我只是忽略了部分课程的要点。也有人可以提供现实世界的使用。

8 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

关于部分类的好处是你可以使用现有的类并添加它。现在这听起来很像继承,但是有很多东西,继承不能做部分类。

这里有一个想到为你生成的Linq to SQL类。它们是自动生成的,这意味着您不应该修改它们。如果没有分部类,则无法附加界面。 您可以创建一个新类并从Linq到sql类派生它,但这实际上并不能解决任何问题,因为您无法使用该接口将linq更新为sql类到您的类。

答案 3 :(得分:2)

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

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

答案 4 :(得分: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.
}

不能用抽象类重新创建它的双向性。

答案 5 :(得分:1)

听起来你的问题是

之间的区别
partial class Foo
{
  PART ONE
}
partial class Foo
{
  PART TWO
}

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

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

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

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

如果派生类型可以扩展基类型的可见性,那么这些问题就不会过于成问题;一个人会认为FooBase是一个“一次性”的标识符,它会出现两次:一次出现在声明中,一次出现在Foo的声明行上,并认为每个FooBase都是一个伪装成FooFooBase Foo无法在没有类型转换的情况下在this上使用{{1}}实例成员的事实可能会令人厌烦,但也可能会鼓励对代码进行良好的分区。但是,由于无法扩展基类型的可见性,因此抽象级设计看起来很糟糕。

答案 6 :(得分:0)

部分类的目的是允许类的定义跨越多个文件。这可以提高代码的可维护性和分离性。

答案 7 :(得分:0)

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