web-dev-qa-db-ja.com

抽象クラスのメソッドのextern、abstract、partialの違いは何ですか?

抽象クラスを作成しているのは、一般的に使用されるメソッドをいくつか提供し、具体的すぎるメソッドをいくつか必要とし、一部のメソッドを「拡張」できるようにするためです。コンパイラエラーにぶつかった後、externabstract、およびpartialキーワードの違いを誰かが説明できるかどうか疑問に思います。それらはどういう意味で、いつ/どこで使用すればよいですか?

23
ProgrammingPope

extern はあなたが使いたいものではないでしょう。これは、メソッドが実装されているが、外部で実装されていることを意味します。通常、外部コードに実装されているメソッドを定義する相互運用シナリオで使用されます。

abstract は、一方、メソッドのAPIを定義しているが、実装を提供していないことを意味します。サブクラスは、abstractとマークされたメソッドまたはプロパティの実装を提供するか、それ自体がabstractである必要があります。基本クラスを作成し、サブクラスで実装する必要のあるメソッドまたはプロパティがある場合は、abstractを使用することをお勧めします。

partial クラスとメソッドは単なるコンパイルツールです。複数のファイルを使用してタイプを定義できます。これは主に自動生成されたコードで使用されます(つまり、デザイナーはデザイナーが生成したコードを部分クラスを定義する別のファイルに配置するため、実装の詳細を見なくても不足している部分を「埋める」ことができます)。これは、クラスを定義するために直接使用するものではありません。

31
Reed Copsey

externメソッドは通常、dll-import(P/Invoke)を介して実装されているため、実装がありますが、表示されません。

partialメソッドは、生成されたコードに機能を挿入する方法として、主にコード生成で役立ちます。それらはオプションで、プライベートのみであり、残りの半分を提供する場合はのみ存在します。そのため、明確な割り当てを保証するために、戻り値/出力値に関していくつかの制限もあります。実装がない場合、部分メソッドの呼び出しはコンパイラによって完全に省略されます。

abstractメソッドは、派生型によって実装を提供する必要がある場所です。ランタイムは、実装されていない抽象メソッドがまだある場合はインスタンスを作成できないことを保証するため、実行時にそれらが存在することが保証されます。

5
Marc Gravell

Externを使用すると、dll-importを介してメソッドを使用できます。これにより、外部ソースからのメソッドに特別な意味を与えることができます。

部分的:

  1. 部分メソッドは、部分クラスまたは部分構造内で宣言する必要があります
  2. 部分メソッドにアクセス修飾子を設定することはできません
  3. 部分メソッドには、アクセス修飾子、または仮想、抽象、オーバーライド、新規、封印、または外部修飾子を含めることはできません。
  4. 部分メソッドは、個別の宣言の前に実装することはできません。
  5. 部分メソッドは定義のみ可能であり、同じ部分クラスで宣言することはできません。

* PartialメソッドとAbstractメソッドの最も重要な違いは、Partialの実装はオプションですが、Abstractメソッドの実装は必須です*

抽象メソッドは、非抽象派生クラスでの実装を厳密に要求します

抽象メソッドの基本的な使用法は、クラスを使用するために実装する必要があるということです。これらのメソッドは、そのクラスを効率的に活用するのに役立つからです。

4
Ajay Suwalka

Extern: http://msdn.Microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx

抽象(C#リファレンス)修飾子とextern修飾子を一緒に使用して同じメンバーを変更するのはエラーです。 extern修飾子を使用することは、メソッドがC#コードの外部で実装されることを意味し、abstract修飾子を使用することは、メソッド実装がクラスで提供されないことを意味します。

要約: http://msdn.Microsoft.com/en-us/library/sf985hc5%28v=vs.80%29.aspx

クラス宣言でabstract修飾子を使用して、クラスが他のクラスの基本クラスになることのみを目的としていることを示します。抽象としてマークされたメンバー、または抽象クラスに含まれるメンバーは、抽象クラスから派生したクラスによって実装される必要があります。

部分的: http://msdn.Microsoft.com/en-us/library/wbx7zzdd%28v=vs.80%29.aspx

部分的な型定義により、クラス、構造体、またはインターフェースの定義を複数のファイルに分割できます。

3
Priyank

ここにはいくつかの良い答えがあるようですが、それでももっと明確にするために書きます

Extern

C#仕様から

メソッド宣言にextern修飾子が含まれている場合、そのメソッドは外部メソッドと呼ばれます。外部メソッドは、通常、C#以外の言語を使用して外部で実装されます。外部メソッド宣言は実際の実装を提供しないため、外部メソッドのメソッド本体は単にセミコロンで構成されます。外部メソッドは一般的ではない場合があります。 extern修飾子は通常、DllImport属性と組み合わせて使用​​され、外部メソッドをDLL(ダイナミックリンクライブラリ)で実装できるようにします。実行環境は、外部メソッドの実装を提供できる他のメカニズムをサポートする場合があります。外部メソッドにDllImport属性が含まれている場合、メソッド宣言には静的修飾子も含める必要があります。 enter image description here

部分的

部分メソッドのシグネチャは部分型の一部で定義され、その実装は型の別の部分で定義されます。部分メソッドを使用すると、クラス設計者は、イベントハンドラーと同様に、開発者が実装するかどうかを決定できるメソッドフックを提供できます。開発者が実装を提供しない場合、コンパイラはコンパイル時に署名を削除します。部分メソッドには、次の条件が適用されます。

  • 部分型の両方の部分の署名は一致する必要があります。
  • メソッドはvoidを返す必要があります。
  • アクセス修飾子は許可されていません。部分メソッドは暗黙的にプライベートです。

次の例は、部分クラスの2つの部分で定義された部分メソッドを示しています。

enter image description here

要約

メソッドまたはプロパティの宣言で抽象修飾子を使用して、メソッドまたはプロパティに実装が含まれていないことを示します。

抽象メソッドには次の機能があります。

  • 抽象メソッドは暗黙的に仮想メソッドです。
  • 抽象メソッド宣言は、抽象クラスでのみ許可されます
  • 抽象メソッド宣言は実際の実装を提供しないため、メソッド本体はありません。メソッド宣言は単にセミコロンで終わり、署名の後に中括弧({})はありません。
  • 抽象メソッド宣言で静的修飾子または仮想修飾子を使用するとエラーになります。

この例では、クラスSquareはShapesClassから派生しているため、Areaの実装を提供する必要があります。

enter image description here

ソース

これがより良い理解に役立つことを願っています、ハッピーコーディング!

2
StaticVariable