-->

什么是使用部分类,而不是一个抽象的好处?(What are the benefits to usin

2019-06-24 09:53发布

我一直在阅读编程微软的Visual C#®2008:语言,以获得更好的理解C#,哪些可以用它来完成。 我遇到了,我已经从ASP.Net的Page类中遇到部分类。

对我来说,似乎你能做什么部分类做一个抽象类和重写一个。 显然,一个团队将通过抽象方法的接口控制,但你会反正相互依托。 如果我们的目标是合作那么这不正是源控制等手段解决。

我只是缺少点的分部类。 也可能有人提供了一个真实的世界中。

Answer 1:

部分类都无关的对象继承。 部分类只是一个分裂定义一个类为独立的文件(例如,这是当您在Windows中创建一个新的形式完成的源代码的方式窗体应用程序 - 一个文件是“你的”代码,另一个文件了.Designer.cs包含VS2008为您管理的代码)。



Answer 2:

一个很好的用途的例子是当产生部分类的一侧(例如一个ORM)



Answer 3:

有关分部类的伟大的事情是,你可以利用现有的类,并添加到它。 现在,这听起来很像继承,但也有很多的东西,继承不能这样做,部分班会。

下面是想起了一个LINQ到为您生成SQL类。 他们是自动生成的意思是,你不应该对其进行修改。 如果没有局部类,你不能将一个接口。 您可以创建一个新的类并从中获得从LINQ到SQL类,但真的没有得到你什么,因为你不能在LINQ to SQL的类上溯造型与接口的类。



Answer 4:

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

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



Answer 5:

局部类现在用于巨资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.
}

这样做的双向自然无法与抽象类中重新创建。



Answer 6:

这听起来像你的问题是有什么区别之间

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也将必须是公开的。 即使所有的构造FooBaseinternal ,这将是可能的外码来定义从派生的类FooBase但不Foo ; 构建这样的类的实例会很困难,但并非不可能。

如果有可能的派生型,以扩大基本类型的可见性,这些问题不会过于有问题; 人们会认为FooBase在其声明中声明行上一次,一旦:作为将恰好出现两次“暴殄天物”标识Foo ,图,每一个FooBase将是一个Foo的化身。 这一事实FooBase不能使用Foo的实例成员this没有强制类型转换可能是令人侧目,但也可能鼓励代码的好分区。 因为它是不可能扩大基本类型的知名度,但是,抽象类的设计似乎恶心。



Answer 7:

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



Answer 8:

我们使用部分类分裂我们的大课。 这样更容易检查出与SourceSafe中的部分代码。 这限制了其中四个显影需要访问同一个文件的情况。



文章来源: What are the benefits to using a partial class as opposed to an abstract one?