8

私は、ProgrammingMicrosoft®VisualC#®2008:The Languageを読んで、C#とそれを使って何ができるかをよりよく理解しています。ASP.NetのPageクラスからすでに遭遇した部分的なクラスに出くわしました。

私には、部分クラスが抽象クラスとオーバーライドされたクラスで行うことを実行できるようです。明らかに、1つのチームが抽象メソッドを介してインターフェースを制御しますが、とにかくお互いに依存することになります。そして、目標がコラボレーションである場合、ソース管理や他のツールが解決するのはそれではありません。

部分的なクラスのポイントが欠けています。また、誰かが実際の使用法を提供することもできます。

4

8 に答える 8

21

部分クラスは、オブジェクトの継承とは何の関係もありません。部分クラスは、クラスを定義するソースコードを個別のファイルに分割する方法にすぎません(これは、たとえば、Windowsフォームアプリケーションで新しいフォームを作成するときに行われます。1つのファイルは「自分の」コードで、別のファイルは.designer.csです。 VS2008が管理するコードが含まれています)。

于 2009-06-29T11:40:34.153 に答える
4

良い使用例は、部分クラスの片側が生成される場合です(ORMなど)

于 2009-06-29T11:40:44.013 に答える
4

部分クラスの優れた点は、既存のクラスを取得して追加できることです。これは継承によく似ているように聞こえますが、部分クラスでは実行できて継承では実行できないことがたくさんあります。

生成された Linq to SQL クラスについて考えてみます。これらは自動生成されるため、変更しないでください。部分クラスがないと、インターフェイスをアタッチできません。新しいクラスを作成し、それを Linq to sql クラスから派生させることもできますが、インターフェイスを使用して linq to sql クラスをクラスにアップキャストできないため、実際には何も得られません。

于 2009-06-29T11:46:06.703 に答える
2

部分クラスは、他のコードを変更できない自動生成コードでの使用に制限する必要があります。継承の代わりとして使用したり、機能を追加したりすることは、ベスト プラクティスではありません。

大規模なクラスがある場合、それはすでに間違っています。コードは、複数のファイルではなく、複数の「実際の」クラスにリファクタリングする必要があります。一般に、大規模なクラスは、そのクラスがあまりにも多くのことを行っていることを意味し、SRP (Single Responsibility Principle) に違反しています。

于 2011-04-07T16:03:06.543 に答える
1

あなたの質問のように聞こえますが、違いは何ですか

partial class Foo
{
  PART ONE
}
partial class Foo
{
  PART TWO
}

astract class FooBase
{
  PART ONE
}
partial class Foo : FooBase
{
  PART TWO
}

それらはいくぶん似ているように見え、場合によっては前者の代わりに後者の構文を使用できますが、後者のスタイルには少なくとも 2 つの問題があります。

-1- 型FooBaseは、それから派生するはずの具体的な型のアイデンティティを知っている必要があり、 type ではなく常にその型の変数を使用する必要がありますFooBase。これは、2 つのタイプの間の不快なほど密接な結合を表しています。

-2- typeFooが public の場合、 type も public でFooBaseある必要があります。のすべてのコンストラクターが であっFooBaseてもinternal、外部コードが ; から派生したクラスを定義することは可能ですが、 ;FooBaseではありませんFoo。そのようなクラスのインスタンスを構築するのは困難ですが、不可能ではありません。

派生型が基本型の可視性を拡張できる場合、これらの問題はそれほど問題にはなりません。正確に 2 回出現する「使い捨て」識別子と見なすことができます。1FooBase回はその宣言で、もう 1 回は の宣言行でFoo、すべてFooBaseFoo変装したものになると考えます。型キャストなしでインスタンス メンバーをFooBase使用できないという事実は面倒かもしれませんが、コードの適切な分割を促進することにもなります。ただし、基本型の可視性を拡張することはできないため、抽象クラスの設計は厄介に見えます。Foothis

于 2013-06-16T20:59:39.357 に答える
1

ASP.Net では部分クラスが頻繁に使用され、マークアップ ベースの example.aspx とコード ベースの example.aspx.cs の 2 つのソース ファイルを使用できるようになり、それぞれで定義されたメソッドと変数がそれぞれに表示されるようになりました。example.aspx で

<custom:exampleControl id="exampleCntr" property="<%#getProperty()%>" />

example.aspx.cs で

private object GetProperty(){ // called from aspx
    return DateTime.Now;
}

private void DoStuff(){
    ExampleControl c = exampleCntr; //exampleCntr is defined in aspx.
}

この双方向性は、抽象クラスでは再現できません。

于 2009-06-29T12:39:36.813 に答える
0

部分クラスの目的は、クラスの定義が複数のファイルにまたがることを可能にすることです。これにより、コードの保守性と分離性が向上します。

于 2009-06-29T11:41:48.677 に答える
0

部分クラスを使用して、より大きなクラスを分割します。そうすれば、Sourcesafe を使用してコードの一部を簡単にチェックアウトできます。これにより、4 人の開発者が同じファイルにアクセスする必要がある場合が制限されます。

于 2009-06-29T11:44:51.103 に答える