我正在阅读关于Partial关键字的MSDN文章,这部分引起了我的注意:
partial关键字表示类的其他部分,struct, 或接口可以在命名空间中定义。所有部件必须使用 部分关键字。所有部件必须在编译时可用 形成最终类型。所有部件必须相同 可访问性,例如公共,私人等。
[...]
指定基类的所有部分必须同意,但部分必须同意 省略基类仍然继承基类型。 部件可以指定 不同的基接口,最终的类型实现了所有 所有部分声明列出的接口。任何类,结构, 或者在部分定义中声明的接口成员可用 所有其他部分。 最终类型是所有的组合 零件在编译时。
我对这个概念有两个问题:
首先,似乎这是一种绕过C#中缺少多重继承的方法(当然除了接口)。除了正常的多重继承问题,例如钻石问题,这样做是否会产生任何影响?基本上,仅仅因为我可以,这是否意味着我应该?
其次,我应该何时分割文件?通过阅读本文,我觉得我应该能够在自己的文件中声明一个嵌套类,并将其与包含的类一起分开,从而提高可读性。这是Partial的要点,还是应该只按照上面的文章中的描述使用?
答案 0 :(得分:8)
首先,这与C#中的多重继承无关。它只是允许您在文件之间拆分类的实现。 C#中的常规类也可以实现多个接口,因此您不会通过使用部分类获得任何东西。
其次,当某个类的实现的一部分由某个工具生成而另一部分由开发人员编写时,部分类最有用。这允许您重新生成代码的生成部分,而不会丢失实现的手动编码部分。
答案 1 :(得分:2)
部分类与多重继承无关。使用它们的唯一非常好的理由是生成类的一部分而另一部分是您自己的。
答案 2 :(得分:2)
不,它提到了基本接口,而不是具体类型,因此仍然无法进行多重继承。对于第二点,主要原因是允许生成工具创建一个部分,它隐藏了开发人员编辑的部分实现细节。
答案 3 :(得分:1)
首先,似乎这是一种绕过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的要点,还是只应按照上面的文章中的描述使用?
代码生成是一个众所周知的例子。在处理Facade模式时,我个人经常使用部分类(这在创建WCF / SOAP服务时非常有用)。在大多数情况下,我会出于上述原因试图避免它。