【问题标题】:What is the advantage of partial classes over inheritance?部分类比继承有什么优势?
【发布时间】:2014-08-24 02:33:10
【问题描述】:

C# 有部分类的概念。我见过的一个例子是WSDLs。 Visual Studio 可以联系服务器以查找服务,并根据它自动生成分部类。然后,Visual Studios 会为您提供一个空白的部分类来匹配它,以便您可以添加自己的代码。

我觉得这种方法相当混乱。部分类比继承有什么优势吗?

【问题讨论】:

  • 访问私有成员(例如,WinForms)
  • 部分类和继承是不同的概念。部分类主要用于与代码生成相吻合
  • @SLaks 你不能在那种情况下保护它吗?

标签: c# wsdl partial partial-classes generated-code


【解决方案1】:

部分类用于解决特定问题 - 解决分离生成代码和手动编程代码的问题。如果没有部分类,程序员需要避免修改生成的类,或者rely on a design pattern 来实现分离。

非常重要的一点是部分类的生成部分具有实现。这将它们与不包含实现的接口区分开来。

从某种意义上说,这使它们类似于抽象类,而不是使它们抽象。您可以扩展和更改功能而无需子类化。

【讨论】:

  • 我还是不明白为什么我们不能生成超类并使用子类。我们可以通过继承公开所有内容,其方式与使用分部类的方式基本相同。生成一个我们不应该接触的超类会有什么损失?
  • @Dgrin91 然后您需要一种机制来说明您希望系统将哪个子类用作实现。此外,它会产生一种错误的印象,即我们已经生成了一个为继承而构建的基类,而不是说它是一个单一的整体类。在某些情况下,生成基类会使系统中的类数量增加一倍。部分类为这个问题提供了一个优雅而简单的解决方案。
  • 已经有一种机制可以说明您希望系统为部分类使用哪个类(即服务的名称),那么自动生成超类有什么问题呢? IE 说我们有一个名为Authentication 的服务。目前,将创建一个 Authentication 部分类。通过继承,将创建一个空的Authentication 类,并将继承自自动生成的AbstractAuthentication。我也不认为将类的数量加倍是一个严重的问题(尽管我可能是错的),因为总代码基本上是相同的。
  • @Dgrin91 C#有一个限制,它一次只能从一个类继承,如果你继承AbstractAuthentication,那么你将无法从其他东西继承。拥有一个抽象类也会让您拥有多个子类,这可能是不可取的。它还会用您永远不会直接引用的类污染您的命名空间,例如,接受AbstractAuthentication 作为参数的方法在任何情况下都可能没有意义。
【解决方案2】:

部分类:
您可以在同一个项目的多个文件中定义一个类。您最终可能会创建一个包含方法的文件,另一个文件包含属性,等等。在编译时,它就像您创建一个包含所有内容的大文件一样。

Read more about partial class and method

继承:
您可以在同一个项目或另一个项目中扩展现有类的功能。通过继承,您可以在新类上扩展现有类的功能、特性等。

【讨论】:

  • -1 因为这不能回答我的问题。我知道有什么区别,但我不明白为什么在这种情况下,partials 比继承更有优势。
  • @Dgrin91 正如我在回答中所说,使用部分类可以保持代码井井有条。您可以创建一个仅包含方法的文件,另一个仅包含属性的文件。当你想检查一个类的属性时,你可以去那个只有属性而没有其他的文件。
  • 你可以用Regions 做同样的事情。我不认为这是一个现实的优势。
  • @Dgrin91 不,你不能。 #region 只是一个文件中的一段切换代码。
【解决方案3】:

约定的部分类更多是关于在多个源文件之间拆分类定义而不是继承。

在我看来,它们的主要原因是框架可以为您生成样板代码,并且您还可以添加方法,而您的代码不会被 Visual Studio 为数据访问或 Web 服务生成创建的东西所覆盖.

在我看来,微软总是头脑不清醒、懒惰。

【讨论】:

    【解决方案4】:

    这是对开发人员的邀请,如果需要在部分类的第二个声明中实现方法 您可以通过压缩大型类来更好地维护您的应用程序。假设您有一个具有多个接口的类,因此您可以根据接口实现创建多个源文件。易于理解和维护实现的接口,源文件在该接口上具有部分类。让我们看看下面的代码sn-p。

      public interface IRegister
      {
    //Register related function
      }
    
      public interface ILogin
      {
    //Login related function
      }
    
      //UserRegister.cs file
     public partial classUser : IRegister, ILogin
      {
    //implements IRegister interface
      } 
    
     //UserLogin.cs file
     public partial classUser
     {
    //implements ILogin interface
     }
    

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • 我认为上面的代码可以知道继承的优势@DanNeely
    猜你喜欢
    • 2014-10-04
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多