我一直在阅读编程Microsoft®VisualC#®2008:语言,以便更好地理解C#以及可以用它做些什么。我遇到过从ASP.Net的Page class中遇到的部分类。
对我来说,似乎你可以用抽象类和被覆盖的类来做部分类。显然,一个团队将通过抽象方法控制界面,但无论如何你都会相互依赖。如果目标是协作,则不是源控制和其他工具解决的问题。
我只是忽略了部分课程的要点。也有人可以提供现实世界的使用。
答案 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
都是一个伪装成Foo
。 FooBase
Foo
无法在没有类型转换的情况下在this
上使用{{1}}实例成员的事实可能会令人厌烦,但也可能会鼓励对代码进行良好的分区。但是,由于无法扩展基类型的可见性,因此抽象级设计看起来很糟糕。
答案 6 :(得分:0)
部分类的目的是允许类的定义跨越多个文件。这可以提高代码的可维护性和分离性。
答案 7 :(得分:0)
我们使用部分类来拆分更大的类。这样,使用Sourcesafe检查部分代码会更容易。这限制了四个开发人员需要访问同一文件的情况。