5

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

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

[...]

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

关于这个概念,我有两个问题:

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

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

4

4 回答 4

8

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

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

于 2013-01-19T20:43:20.603 回答
2

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

于 2013-01-19T20:44:03.053 回答
2

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

于 2013-01-19T20:44:35.063 回答
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,从而提高可读性。这是 Partial 的重点,还是应该只按照上面文章中的描述使用?

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

于 2013-01-19T20:57:38.543 回答