【问题标题】:When should I use the Partial keyword?什么时候应该使用 Partial 关键字?
【发布时间】:2013-01-19 20:41:12
【问题描述】:

我正在阅读有关 Partial 关键字的 MSDN 文章,这部分引起了我的注意:

partial 关键字表示类、struct、 或者接口可以在命名空间中定义。所有零件必须使用 部分关键字。所有部件必须在编译时可用 形成最终类型。所有部件必须具有相同的 可访问性,例如公共、私有等。

[...]

所有指定基类的部分必须一致,但 省略一个基类仍然继承基类。 零件可以指定 不同的基接口,最终类型实现了所有 所有部分声明列出的接口。任何类,结构, 或在部分定义中声明的接口成员可用于 所有其他部分。 最后的类型是所有的组合 编译时的部分。

我对这个概念有两个问题:

  • 首先,这似乎是一种绕过 C# 中缺乏多重继承的方法(当然,除了接口)。除了正常的多重继承问题(例如钻石问题)之外,这样做是否会产生任何影响?基本上,仅仅因为我可以,就意味着我应该吗?

  • 其次,我应该在什么时候拆分文件?读到这里,感觉应该可以在自己的文件中声明一个嵌套类,并把它和包含的类一起partial,从而提高可读性。这是 Partial 的重点,还是只能按照上面文章的描述使用?

【问题讨论】:

  • 部分类主要是一件坏事恕我直言,因为您可能必须在不同文件之间跳转才能查看所有代码。

标签: c# multiple-inheritance partial-classes


【解决方案1】:

首先,这与 C# 中的多重继承无关。它只是允许您在文件之间拆分类的实现。 C# 中的常规类也可以实现多个接口,因此使用分部类不会获得任何好处。

其次,当类的部分实现由某个工具生成而另一部分由开发人员编写时,分部类是最有用的。这允许您重新生成代码的生成部分,而不会丢失实现的手动编码部分。

【讨论】:

    【解决方案2】:

    部分类与多重继承无关。使用它们的唯一很好的理由是当类的一部分是生成的而另一个是你自己的。

    【讨论】:

      【解决方案3】:

      不,它提到了基本接口,而不是具体类型,所以多重继承仍然是不可能的。对于您的第二点,主要原因是允许生成工具创建一个部分,该部分隐藏了开发人员编辑的部分的许多实现细节。

      【讨论】:

      • 哎呀,你完全正确!它用我引用的粗体字在那儿说。
      【解决方案4】:

      首先,这似乎是一种绕过 C# 中缺乏多重继承的方法(当然,除了接口)。除了正常的多重继承问题(例如钻石问题)之外,这样做是否会产生任何影响?基本上,仅仅因为我能,就意味着我应该?

      它不做多重继承。它实际上更邪恶,因为它暴露了私有变量——但同时它没有引入钻石。试试下面的代码看看我的意思:

      public class Test0
      {
          protected int bar;
      
          public void Unexpected() { Console.WriteLine("3. {0}", bar); }
      }
      
      public partial class Test1
      {
          private int foo;
      
          public void Foo() { Console.WriteLine("1. {0}", foo); bar = 1; }
      }
      
      public partial class Test1 : Test0
      {
          public void Bar() { Console.WriteLine("2. {0}", foo); foo = 1; }
      }
      
      class Driver
      {
          public static void Main()
          {
              var t1 = new Test1();
              t1.Bar();
              t1.Foo();
              t1.Unexpected();
              Console.ReadLine();
          }
      } 
      

      换句话说,你应该非常小心变量。

      其次,我应该在什么时候拆分文件?读到这里,感觉应该可以在自己的文件中声明一个嵌套类,并把它和包含的类一起partial,从而提高可读性。这是 Partial 的重点,还是只能按照上面文章的描述使用?

      代码生成是一个众所周知的例子。我个人在处理 Facade 模式时经常使用部分类(这在创建 WCF/SOAP 服务时非常有用)。在大多数情况下,出于上述原因,我会尽量避免它。

      【讨论】:

      • 变量不一定是公开的。 Test1 的第一个声明肯定可以访问Test0 的受保护变量,因为Test1 的组合版本最终继承自Test0。现在,这是否有意由程序员决定。
      • 我试图展示作用域在使用 partial 时是如何工作的。关键是本地(类内)和受保护(来自继承)变量都是可访问的,即使另一个部分类继承了基类。很有可能在某些时候您想要使用基类受保护变量,而您实际上正在使用在部分类中声明的局部变量。我通常使用的解决方法是使用尽可能少的变量,并且在处理部分类时不使用继承。
      • 我不明白你的例子。我想这表明某些东西的工作方式与预期不同?你能补充/说什么是“预期的”和真正发生的事情吗? (例如,让读者无需运行代码就能第一眼看到它。)
      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多