web-dev-qa-db-ja.com

抽象クラスのオブジェクトを作成できないのはなぜですか?

ここに私の心の中のシナリオがあり、私はグーグルで検索しました。

「Abstractクラスはメソッドを実装していないため、オブジェクトを作成できません」「Wordの「Abstract」はコンパイラにクラスのオブジェクトを作成しないよう指示します」

しかし、すべての仮想メソッドを持ち、オブジェクトを作成できる単純なクラスで?

また、private、protected、publicなど、Abstractクラスコンストラクターに変更されたさまざまなアクセスを定義できます。

私の検索はこの質問で終了しました:

なぜ抽象クラスのオブジェクトを作成できないのですか?

18
Gaurav Aroraa

abstractタイプは、主に作成できないものとしてdefinedです。 サブタイプを作成できますが、そのタイプ自体は作成できません。 CLIではこれを実行できません。

abstractクラスにはprotectedコンストラクター(デフォルト)があり、派生型で初期化できます。

たとえば、ベースタイプStreamは抽象です。派生型なしデータはどこへ行くかabstractメソッドを呼び出すと、happenはどうなりますか?呼び出すメソッドの実際の実装はありません。

58
Marc Gravell

それは抽象的であり、オブジェクトは具体的だからです。抽象クラスは、一種のテンプレート、または空の/部分的に空の構造のようなものであり、使用する前に拡張して構築する必要があります。

たとえば、「動物」抽象クラスを取り上げます。 「純粋な」動物のようなものはありません-特定の種類の動物がいます。したがって、DogとCatとTurtleをインスタンス化できますが、プレーンなAnimalをインスタンス化することはできません-これは単なる基本テンプレートです。そして、「makeSound()",」など、すべての動物が共有する特定の機能がありますが、これはベースのAnimalレベルでは定義できません。したがって、Animalオブジェクトを作成してmakeSound(),オブジェクトはどの音を出すかを知っていますか?

21
froadie

基本クラスとして使用することを目的としています。

http://msdn.Microsoft.com/en-us/library/sf985hc5(VS.71).aspx

Abstract修飾子は、クラス、メソッド、プロパティ、インデクサー、およびイベントで使用できます。

クラス宣言でabstract修飾子を使用して、クラスが他のクラスの基本クラスのみであることを示します。

抽象クラスには次の機能があります。

  • 抽象クラスはインスタンス化できません
  • 抽象クラスには、抽象メソッドとアクセサを含めることができます。
  • Seal修飾子を使用して抽象クラスを変更することはできません。つまり、クラスを継承することはできません。
  • 抽象クラスから派生した非抽象クラスには、継承されたすべての抽象メソッドとアクセサの実際の実装が含まれている必要があります。
4
hunter

他の回答への追加として、抽象クラスのインスタンスを作成できない場合がありますが、抽象型を通じて派生型のインスタンスを確実に参照し、抽象ベース内で定義されたメソッドまたはプロパティを使用できます。

abstract class A
{
    public abstract void D();
    public void E() { }
}

class B : A
{
    public override void D() { }
}

class C : A
{
    public override void D() { }
}

...

A a = new B();
a.D();
a.E();

List<A> list = new List<A>() { new B(), new C() };
3
Anthony Pegram

簡単に言えば、抽象クラスはクラスのシェルのようなものです。すべてのメソッドに実装があるわけではありません。一部のワイヤセグメントが欠落している回路のようなものです。その大部分は構築できますが、これらのセグメントのワイヤと抵抗を適切に固定するのはユーザー次第です。

なぜJavaで作成できないのか、その一部は単なるフェイルセーフです(多くの抽象クラスは、実装されていないメソッドを呼び出さない限り、追加することなく正常に機能します) 。

2
Ritwik Bose

抽象クラスには、実装のない少なくとも1つの仮想メソッドまたはプロパティが必要です。これは、abstractキーワードでマークされています。継承クラスは、それ自体が抽象クラスではない場合、実装を提供する必要があります。完全な実装がないため、抽象クラスのインスタンスを作成することはできません。存在する場合、そもそも抽象とマークしないでください。

2
Tom Cabanski

抽象クラスbcozのオブジェクトを作成することはできません。ほとんどの場合、抽象クラスには「抽象メソッド」が含まれているため、抽象メソッドは不完全なメソッドです。抽象クラスのオブジェクトを作成できません。

1
praneeth

純粋な仮想関数を含むクラスがある場合、そのクラスは抽象クラスです。抽象クラスのオブジェクトを作成し、本体のないメソッドを呼び出すと(メソッドは純粋な仮想であるため)、エラーが発生します。それが抽象クラスのオブジェクトを作成できない理由です。

1

参照 studytonight

Abstractクラスで純粋な仮想関数を作成するとき、VTABLEの関数用のスロットを予約します(最後のトピックで学習しました)が、そのスロットにはアドレスを入れません。したがって、VTABLEは不完全になります。

AbstractクラスのVTABLEは不完全であるため、コンパイラはそのようなクラスのオブジェクトの作成を許可せず、実行しようとするとエラーメッセージを表示します。

0
msc

Abstractクラスで純粋な仮想関数を作成するとき、VTABLEの関数用のスロットを予約します(最後のトピックで学習しました)が、そのスロットにはアドレスを入れません。したがって、VTABLEは不完全になります。

AbstractクラスのVTABLEは不完全であるため、コンパイラはそのようなクラスのオブジェクトの作成を許可せず、実行しようとするとエラーメッセージを表示します。

ソースStudy Tonight

0
Dharani Dharan

同様のStackOverflowの質問があります。要するに、抽象クラスにパブリックコンストラクターを持つことは合法です。一部のツールは、これが意味をなさないことを警告します。

C#の抽象クラスのパブリックコンストラクターのユーティリティは何ですか?

0
Paul Williams

実際、通常のクラスのオブジェクトを作成するときは、Constructorを使用してそのオブジェクトにメモリを割り当てます

myclass obj=new myclass();

ここでは、コンストラクターclrを使用して、インスタンス変数とメソッドに応じて、オブジェクトに必要なメモリ量を識別します。しかし、抽象クラスの場合、抽象メソッドを実装しないためオブジェクトを作成できないため、必要なメモリ量を予測できません。

0
Vaibhav k.