この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。
建築家
建築家
リスト
放送
茶屋
インテリジェントAI会話
.NETキャリア&テクニカルカレッジ
ちっちゃいなクズブログ
この版
利用者
Architect_Programmer_Code農業ネットワーク
»
建築家
›
プログラミング
›
.Net/C#
›
C#では、仮想と(抽象)抽象およびインターフェースの段階が...
眺める:
18805
|
答える:
0
[通信]
C#における仮想抽象と(抽象)抽象およびインターフェースの類似点と相違点...
[リンクをコピー]
夏
掲載地 2019/04/22 14:41:09
|
|
|
解釈1
C#では、抽象と仮想は継承に関係し、オーバーライドの使用を含むため混乱を招きます。 この二つの違いについて話してみましょう。
1. 仮想方法
仮想キーワードは基本クラスのメソッドを変更するために使われます。 仮想が使われる状況は2つあります。
シナリオ1:仮想メソッドがベースクラスで定義されているが、その仮想メソッドは派生クラスで書き換えられない。 派生クラスインスタンスへの呼び出しでは、仮想メソッドはベースクラスで定義されたメソッドを使用します。
シナリオ2:ベースクラスで仮想メソッドが定義され、そのメソッドは派生クラスのオーバーライドで書き換えられます。 派生クラスインスタンスへの呼び出しでは、仮想メソッドは派生リライトメソッドを使用します。
2. 抽象法(抽象法)
抽象キーワードは抽象クラスでのみメソッドを修正するために使用でき、特定の実装はありません。 抽象メソッドの実装は、派生クラスのオーバーライドキーワードを使って実装しなければなりません。
インターフェースと抽象クラスの最も重要な違いは、抽象クラスは不完全クラスであり、オブジェクトの抽象化であるのに対し、インターフェースは行動規範であるということです。
3. キーワード
静的:メソッドが静的と宣言されると、そのメソッドは静的メソッドであり、コンパイラはコンパイル時にそのメソッドの実装を保持します。 つまり、メソッドはクラスに属しますが、クラスのインスタンスが存在するかどうかに関わらず、どのメンバーにも属しません。 エントリ関数の静的ヴォイドメインと同様に、静的関数であるため直接呼び出すことができます。
Virtua:メソッドがVirtualとして宣言されると、ClassName変数=new ClassName()を使うまでは仮想メソッドのままです; クラスのインスタンスを宣言する前は、そのクラスは実のメモリ空間には存在しません。 このキーワードはクラス継承において、クラスメソッドの多型サポートを提供するために非常に一般的に使われます。
overrride: 書き換えを示します。このクラスはShapeクラスから継承します。
仮想的で抽象的なのは、彼から継承したい他のクラスに対して、この方法やプロパティを上書きしてもよいと伝えることです。そうでなければ許可されません。
抽象:抽象メソッド宣言は、継承するために使われる派生クラスによって上書きされるべきメソッドです。 これは実現のない想像上の方法と見なすことができます。 クラスに抽象メソッドが含まれている場合、そのクラスは他の一般的なメソッドを含むかどうかにかかわらず抽象クラスとして定義されなければなりません。 抽象クラスは実体を持ち得ません。
a) 仮想修正のメソッドにはメソッド実装(たとえブレイシスのペアであっても)が必要であり、抽象修正のメソッドは実装を持てない。
b) 仮想はサブクラスによって書き換えられ、抽象はサブクラスによって書き換えられる
c) クラス内の関数がabstactによって修正された場合、クラス名もabstactで修正しなければならない
d) 抽象化された修正クラスはインスタンスとして作成できません。
e) C#のメソッドがサブクラスの親クラスを書き換える準備がある場合、そのメソッドは親クラスにvirtual、サブクラスにはオーバーライドを加えて修正しなければなりません。これにより、プログラマが誤ってサブクラスの親クラスの親メソッドを書き換えるのを防ぎます。
注意:抽象化で修正されたクラスは継承のみ可能で、インスタンス化はできません。
解釈2
仮想クラスと抽象クラスの両方を使って親クラスを修正し、親クラスの定義を上書きすることで子クラスを再定義できます。
共通点は、メソッドを修正するために使われる場合は、パブリックをその前に追加しなければならず、そうでなければコンパイルのエラーが発生します。仮想メソッドや抽象メソッドはプライベートにはなりません。 結局のところ、仮想的または抽象的な要素を加えることでサブクラスを再定義でき、プライベートメンバーはサブクラスからアクセスできません。
しかし、それらは非常に異なります。 (仮想は「仮想」、抽象は「抽象」です)。
(1) 仮想修正の手法は実装されなければならず(たとえブレイシスのペアだけを追加しても)、抽象的修正の方法は実装されてはならない。 例えば、仮想修正の手法が実装されていない場合:
ログインが見えます。
エラー:「Test1.fun1()」は、本体が抽象的、外部的、または部分的にマークされていないため、宣言しなければなりません
抽象修飾子の場合、実装された場合:
ログインが見えます。
エラー:「Test2.fun2()」は抽象としてマークされているため、本体を宣言できません
(2) 仮想はサブクラスによって書き換えられるが、抽象はサブクラスによって書き換えられなければならない。
ログインが見えます。
コンパイルにエラーはありません。仮想修飾子のメソッドが書き換えられた場合、その前にオーバーライドが追加され(これがコンパイラに仮想メソッドの書き換えを知らせるため)、実装がなければコンパイルが誤ってなりません。
ログインが見えます。
(3) クラスメンバーが抽象によって修正された場合、抽象メソッドを持つのは抽象クラスのみであるため、クラスの前に抽象を付け加えなければなりません。
(4) 抽象クラスのインスタンスは作成できず、継承のみ可能でインスタンス化できません。例えば、BaseTest2 base2 base2 = new BaseTest2(); コンパイルエラーが発生します:抽象クラスやインターフェースはインスタンスを作成できません。
(5)C#では、サブクラスのメソッドを書き換えたい場合は、親メソッドの前にvirtualを付け、サブクラスメソッドの前にオーバーライドする必要があります。これはプログラマーが誤ってサブクラスの親メソッドを書き換えないようにするためです。
(6) 抽象メソッドは上書きされなければならず、仮想メソッドには実装が必要です(たとえ抽象クラスで定義されたメソッドであっても)。
ログインが見えます。
解釈3
類似点:
1. すべて相続可能です
2. いずれもインスタンス化できない
3. メソッド宣言を含むことができます
4. 派生クラスは未実現のメソッドを実装しなければならない
分かつ:
1. 抽象基底クラスはフィールド、属性、メソッド実装を定義できます。 インターフェースは属性、インデクサ、イベント、メソッド宣言のみを定義でき、フィールドを含めることはできません。
2. 抽象クラスはさらに洗練が必要な不完全クラスであり、インターフェースは行動規範です。 Microsoftのカスタムインターフェースには、必ず「自分ならできる...」という表現を示すための適切なフィールドが付属しています。 ”
3. インターフェースは複数回実装可能で、抽象クラスは一人の人物にしか継承できません
4. 抽象クラスは密接に関連する一連のクラス間でより定義され、ほとんどのインターフェースはゆるやかに関連していますが、すべて特定の関数を実装しています
5. 抽象クラスとは、関連する一連の対象から抽象化された概念であり、物事の内部的な共通性を反映しています。 インターフェースとは、外部呼び出しを満たすために定義された機能的な慣習であり、外部の特性を反映します
6. インターフェースには基本的に特定の継承特性はなく、呼び出せるメソッドを約束するだけです
7. インターフェースはコールバックをサポートすることができますが、継承にはこの機能はありません
8. 抽象クラスで実装される特定のメソッドはデフォルトで仮想ですが、そのインターフェースを実装するクラス内のインターフェースメソッドはデフォルトで非仮想的です。もちろん仮想としても宣言できます
9. 抽象クラスがインターフェースを実装する場合、インターフェース内のメソッドは抽象メソッドとして抽象クラスにマッピングできますが、インターフェース内のメソッドは抽象クラスのサブクラスに実装できます
使用ルール:
1. 抽象クラスは主に密接に関連するオブジェクトに使われ、インターフェースは無関係なクラスの一般的な機能を提供するのに最適です
2. 大きな関数型ユニットを設計したい場合は抽象クラスを使い、 小さく簡潔な機能ブロックを設計したいなら、インターフェースを使いましょう。
3. コンポーネントの複数のバージョンが作成される予定がある場合は、抽象クラスを作成します。 一度インターフェースが作成されると、それは変更できません。 インターフェースの新しいバージョンが必要な場合は、まったく新しいインターフェースを作成する必要があります。
4. 作成された関数が幅広い異種オブジェクト間で使用される場合は、インターフェースを使用してください。 コンポーネントのすべての実装で共通の実装機能を提供したい場合は、抽象クラスを使いましょう。
5. 対象を分析し、内部の共通性を精緻化して抽象的なクラスを形成し、対象の本質、すなわち「何」を表現する。 インターフェースは外部呼び出しや関数の拡張が必要な場合に優先されます
6. 良いインターフェース定義は、多機能ではなく、具体的かつ機能的であるべきです。そうでなければインターフェース汚染を引き起こします。 クラスがインターフェースの関数の一つだけを実装し、他のメソッドを実装しなければならない場合、それはインターフェース汚染と呼ばれます
7. 形成関数を得るために継承を使わず、ブラックボックス多重化、すなわちオブジェクトの組み合わせを用いましょう。 遺伝レベルの増加により、最も直接的な結果は、この分類群のクラスを呼び出す際に、それらをすべてスタックに読み込む必要があることです! その結果は想像に難くありません。 (スタック原理の理解と組み合わせて) 同時に、興味のある友人は、Microsoftがクラス構築時にオブジェクト結合の手法をよく使っていることに気づくでしょう。 例えば、asp.net では、ページクラスにはServer Requestのようなプロパティがありますが、実際にはすべて特定のクラスのオブジェクトです。 Pageクラスのこのオブジェクトを使って他のクラスのメソッドやプロパティを呼び出すのは非常に基本的な設計原則です
例えば:
ウィンドウフォームは抽象クラスで設計でき、公開操作やプロパティは抽象クラスに配置することで、フォームやダイアログボックスはこの抽象クラスから継承し、必要に応じて拡張・改善できます。
印刷操作は、フォームの内容が異なり、それぞれが独自の要件に応じて印刷機能を実装する必要があるため、この機能を必要とする各フォームに対してインターフェースとして提供できます。 印刷時には、どのフォームが印刷されていてもインターフェースを通じてのみ呼び出されます。
共通点、個性、選択:
いくつかの書籍では、C#は抽象基底クラスの代わりにインターフェースを使うことを推奨し、インターフェースを使う多くの利点を強調していますが、私もそれに異論はありません。上記のリストからも両者の間には多くの違いがあり、その違いの存在が適用されるシナリオでの違いを決定しなければなりません。例えば、抽象基底クラスは特定のメソッドに対してデフォルト実装を提供し、サブクラスでの繰り返し実装を避け、コードの再利用性を向上させることができます。 これが抽象クラスの利点です。 インターフェースは抽象メソッドのみを含めます。 抽象基底クラスをいつ使い、いつインターフェースを使うかは、継承されたクラス間の接続をユーザーがどう捉えているか、性格の違いなのか共通のつながりなのかによって異なります。 人生の例で例を挙げましょう。
もし人間、魚、カエルという3つの対象が与えられ、それらのつながりを要約するために基本カテゴリーを設計するよう求められたら、最初に感じるのはそれらの間に大きな違いがあり、共通点を抽象化するのが難しいということです。 ここで抽象基底クラスの代わりにインターフェースを使うことを検討すべきです。理由は3つあります:
ログインが見えます。
1. 個性は共通性よりも大きい。
2. 性格に大きな違いがある人でも、いくつかの行動は共通しています。
3. 同じ行動の実現方法には大きな違いがあります。
この時点で、さらに3つのオブジェクト、すなわちアクラニ、コイ、金魚が与えられ、それらのつながりをまとめるためにベースクラスを設計できます。次に気づくのは、それらすべてが魚に属していること、次に泳ぎ方が少し異なるかもしれないということです。ですので、インターフェースの代わりに抽象的なベースクラスを使うべきです。上記の例と比べて、3つの理由があります。
ログインが見えます。
1. 共通性は個性よりも大きい
2. 同じ共通点を持つ個人は同じ属性や行動を持っていなければならない
3. 同じ挙動の実装方法には一定の違いがあります
インターフェースや抽象基底クラスを使用する理由はいくつかありますが、三つ目の理由は実は同じで、オブジェクト指向における多型の概念を説明しています。これは親クラスを上書きし、実行時に渡されたオブジェクト参照に従って対応するメソッドを呼び出すことで実装されます。 第二の理由は分岐し始め、インターフェースは継承されたオブジェクト間で同じ振る舞いを重視する一方で、抽象クラスも継承されたオブジェクト間で同じ性質を強調する。 インターフェースと抽象基底クラスを本当に区別する理由は以下の通りです。
インターフェースは、大きな違いを持つオブジェクト間で機能的な共通性を求める場合に使用されます。
抽象基底クラスは、共通性の高いオブジェクト間の関数的差異を求める場合に使用されます。
同じものと異なるものを比較することで、インターフェースと抽象クラスにはそれぞれの強みがあるとしか言えませんが、利点はありません。 実際のプログラミング練習では、自分の才能を状況に応じて測る必要がありますが、以下の経験と蓄積はあなたにインスピレーションを与えるかもしれません。私の積み重ねたものの多くは古典から来ており、試練に耐えられると信じています。 だからルールや場面で、私たちはこれらの古典を学びます。最も重要なのは学んだことを実践することです。もちろん、家族の言葉で皆の笑いを勝ち取るつもりです。どうぞ続けてください。
ルールと行事:
1. オブジェクト指向思考の最も重要な原則の一つは「インターフェース指向プログラミング」であることを忘れないでください。
2. インターフェースや抽象クラスの助けを借りて、23のデザインパターンの多くのアイデアは巧妙に実装されており、その本質は単純に抽象プログラミングに向けられていることだと思います。
3. 抽象クラスは主に密接に関連するオブジェクトに使用すべきであり、インターフェースは無関係なクラスの一般的な機能を提供するのに最適です。
4. インターフェースはCAN-DO関係型に焦点を当て、抽象クラスはIS-A関係に焦点を当てます。
5. インターフェース内のマルチ定義オブジェクトの挙動; 抽象クラスはオブジェクトの性質を多重定義します。
6. インターフェース定義は公開、保護、内部、プライベートの修飾子を使用できますが、ほとんどすべてのインターフェースは公開として定義されているため、これ以上説明する必要はありません。
7. 「インターフェースは変わらない」という点は重要な要素であり、考慮すべきです。 したがって、インターフェースから拡張を追加する際には、既存のインターフェースではなく新しいインターフェースを追加すべきです。
8. インターフェースを単一の関数で機能ブロックに設計しようと試みます。.NET Frameworkを例として、IDisposable、IDisposable、IComparable、IEquatable、IEnumerableなどはすべて共通のメソッドを一つだけ含んでいます。
9. インターフェース名の前に大文字の「I」は慣習であり、フィールド名が下引線で始まるのと同様に、これらの原則を遵守してください。
10. インターフェースでは、すべてのメソッドはデフォルトでパブリックとなります。
11. バージョンの問題が予想される場合は、「抽象クラス」を作成できます。 例えば、犬、鶏、アヒルを作った場合、将来起こりうる問題に対処するために動物を抽象化することを検討すべきです。 インターフェースに新しいメンバーを追加すると、すべての派生クラスが修正・再コンパイルされるため、バージョン管理の問題は抽象クラスで実装するのが最適です。
12. 抽象クラスから派生した非抽象クラスは、すべての継承された抽象メソッドと抽象アクセスの実際の実装を含めなければなりません。
13. 新しいキーワードは抽象クラスには使用できず、また封印することもできません。なぜなら抽象クラスはインスタンス化できないからです。
14. 静的または仮想修飾子は抽象メソッド宣言では使用できません。
先の:
C# Enum Simple Permission DesignはFlagsAttributeプロパティを使用します
次に:
黄勇のイーユン教室はWeChatのミニプログラムをゼロベースで理解しています
関連記事
•
.NET/C#はAzure Translatorのテキスト翻訳インターフェースサービスを呼びます
•
Charles Proxy Scraping HTTPS パケットチュートリアル
•
ASP.NET コア(33)ファイル出力ダウンロード(中国語ファイル名)
•
ASP.NET Core(32)はKeyedServicesの鍵サービスの注入に依存しています
•
フロントエンドの監視と追跡のためのnavigator.sendBeacon()メソッド
•
【株式】テンセントの市場データインターフェース
•
Alibaba Cloud OpenAPI APIを呼び出してサーバー使用状況を調べてください
•
.NET/C#でHUAWEI CLOUD OCR事業ライセンス識別インターフェースを呼び出すために
•
.NET/C# でBaiduユニバーサル翻訳API APIを呼び出します
•
ASP.NET コア(26) インターフェース(最小限のAPI) 最小限のAPI
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。
Mail To:help@itsvse.com