C#での抽象クラスと実際のクラスの継承
-
03-07-2019 - |
質問
継承に抽象クラスと実際のクラスを使用する場合、派生クラスに違いがあるのではないかと思いますか?
実際のクラスの継承は階層を作成するように見えますが、抽象クラスの継承はコンパイラの派生クラスへのコピーアンドペーストのコードですか?
抽象クラスは階層を作成しますか?特別なキーワードを使用してアクセスできますか?
基本キーワードを使用して基本クラスにアクセスすることは知っていますが、抽象メンバーは派生クラスの元のメンバーのように見えますか?
最後に2つのパフォーマンスの違いは何ですか?
解決
はい、抽象クラスは存在します-コンパイラはコピーと貼り付けを行いません。 CLRは引き続き仮想メソッド呼び出しを行う必要があるため、パフォーマンスの違いは見当たりません。
たとえば、次のC#:
abstract class Foo { }
class Bar : Foo { }
次のILを生成します:
.class private abstract auto ansi beforefieldinit Foo
extends [mscorlib]System.Object { }
.class private auto ansi beforefieldinit Bar
extends Foo { }
抽象型の概念は、ILの一部です。
他のヒント
唯一の違いは、抽象ベースクラスは派生せずにインスタンス化できないのに対して、非抽象クラスはインスタンス化できないことです。派生クラスの観点からは、すべてが同じです。
抽象クラスと具象クラスはどちらも(OO)モデリングのツールです。継承ルールと置換ルールに関して違いはありません。いくつかの技術があります:
- 抽象クラスは インスタンス化
- 抽象メソッドは 抽象クラスでのみ許可
ただし、抽象クラスには非抽象メソッド、プロパティ、フィールドを含めることができます。
パフォーマンスはクラスに関連していませんが、抽象/仮想メソッドにはわずかなペナルティがあります。
抽象クラスの力は実装されていません。派生クラスのインスタンスが必要な機能をすべて備えているという確信のために使用できます
抽象クラスは、基本クラスのプリミティブ形式です。これらはインスタンス化できないため、開発者はこれらのクラスから派生して機能を使用する必要があります。抽象クラスで定義された抽象メソッドは、その子クラスで実装する必要があります。したがって、抽象クラスから派生する子クラスに存在する必要があるメソッドを実装できます。 そのため、開発者が必要に応じて派生クラスでカスタマイズできるオブジェクトの基本要素を定義します。
非抽象クラスは、クラス機能を拡張し、非抽象クラスの内容を引き続き使用するのに最適です。すべての非プライベートメンバーとメソッドには、派生クラスからアクセスできます。