5

私はPartialキーワードに関するMSDNの記事を読んでいましたが、この部分が私の目に留まりました。

部分キーワードは、クラス、構造体、またはインターフェースの他の部分を名前空間で定義できることを示します。すべての部分でpartialキーワードを使用する必要があります。最終的な型を形成するには、コンパイル時にすべてのパーツが使用可能である必要があります。パブリック、プライベートなど、すべてのパーツが同じアクセシビリティを備えている必要があります。

[...]

基本クラスを指定するすべての部分が一致する必要がありますが、基本クラスを省略した部分は引き続き基本タイプを継承します。パーツは異なるベースインターフェイスを指定でき、finalタイプは、すべての部分宣言によってリストされたすべてのインターフェイスを実装します。部分定義で宣言されたクラス、構造体、またはインターフェイスメンバーは、他のすべての部分で使用できます。最後のタイプは、コンパイル時のすべての部分の組み合わせです。

この概念に関して2つの質問がありました。

  • まず、これはC#での多重継承の欠如を回避する方法のようです(もちろん、インターフェイスは別として)。菱形継承問題などの通常の多重継承問題以外に、そうすることへの影響はありますか?基本的に、私ができるという理由だけで、それは私がすべきだという意味ですか?

  • 次に、ファイルを正確に分割する必要があるのはいつですか。これを読むだけで、ネストされたクラスを独自のファイルで宣言し、それを含むクラスと一緒に分割して、読みやすさを向上させることができるはずです。これはパーシャルのポイントですか、それとも上記の記事で説明されているようにのみ使用する必要がありますか?

4

4 に答える 4

8

まず、これはC#での多重継承とは何の関係もありません。それは単にあなたがファイル間でクラスの実装を分割することを可能にします。C#の通常のクラスは複数のインターフェイスも実装できるため、部分的なクラスを使用しても何も得られません。

次に、部分クラスは、クラスの実装の一部が何らかのツールによって生成され、他の部分が開発者によって作成される場合に最も役立ちます。これにより、実装の手作業でコーディングされた部分を失うことなく、コードの生成された部分を再生成できます。

于 2013-01-19T20:43:20.603 に答える
2

部分クラスは多重継承とは何の関係もありません。それらを使用する唯一の非常に良い理由は、クラスの一部が生成され、他があなた自身のものである場合です。

于 2013-01-19T20:44:03.053 に答える
2

いいえ、具体的な型ではなく基本インターフェースについて言及しているため、多重継承はまだ不可能です。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();
    }
} 

つまり、変数には十分注意する必要があります。

次に、ファイルを正確に分割する必要があるのはいつですか。これを読むだけで、ネストされたクラスを独自のファイルで宣言し、それを含むクラスと一緒に分割して、読みやすさを向上させることができるはずです。これはパーシャルのポイントですか、それとも上記の記事で説明されているようにのみ使用する必要がありますか?

コード生成はよく知られた例です。個人的には、Facadeパターンを処理するときに部分クラスを頻繁に使用します(これは、WCF / SOAPサービスを作成するときに非常に役立ちます)。ほとんどの場合、私は上記の理由でそれを避けようとします。

于 2013-01-19T20:57:38.543 に答える