2009-06-25 8 views
2
  1. Iは、 2つのコンストラクタ、無 paremeters有するものと 一のPARAM、Iが「S」のサブクラスを有する整数
  2. を受け入れること、他を有する基底クラス、「B」を有する "B"から継承し、 にはコンストラクタを定義しません。
  3. コンストラクタに整数を渡そうとするSのインスタンスを作成します。

私はエラーを取得する:サブクラスはコンストラクタを継承できますか?

Error 1 Too many arguments to 'Public Sub New()

私は思ったので、これは私を驚かせているコンストラクタは、サブクラスで定義されていない場合は、S、その基底クラスのコンストラクタメソッド、具体的には、単一の整数のparamを持つ1は、W/Oエラー呼び出されます。

あなたは?私はこのエラーを取得していますなぜどんな考えを持っている特殊なケースのコンストラクタはありますか?

+1

あなたはどの言語を使用していますか? – MikeyB

+0

私はそれがVB.net(コンストラクタ名は新しく、構文はVBだと思います)だと思います。 – shahkalpesh

答えて

6

、コンストラクタは継承されません。サブクラスは独自のコンストラクタを実装する必要があります。その理由は、基本クラスのコンストラクタはサブクラスのメンバを初期化する方法を知らないため、それらを呼び出すとサブクラスオブジェクトが不良状態になるためです。

+0

最後の3つの回答はきれいだった、私はそれらすべてを投票したが、これを選んだ。ありがとう! – ChadD

1

いいえ、間違った前提です。

コンストラクタを定義しない場合は、パラメータのないコンストラクタが追加されます。

+0

私が間違っていると言っていることがわかりません。私の仮定は正しいと思う。 – ChadD

0

明示的にクラスにコンストラクタを追加しない場合、コンストラクタはデフォルトで空のコンストラクタがありません。そして、私はこれがあなたの質問に答えると思う:)

+0

ええ、私はそれを知っていましたが、なぜそれがマップされているサブクラスで定義されたコンストラクタがなくても、ベースでコンストラクタを呼び出せなかった理由は説明しません。 – ChadD

0

一般に、基本クラスのコンストラクタは公開されていません。むしろ、通常、サブクラスのコンストラクタから呼び出されます。

すべてのクラスには、定義するかどうかにかかわらず、コンストラクタがあります。あなたのケースでは、1つのパラメータを取るサブクラスで定義されたコンストラクタがないので、サブクラスのコンストラクタへの呼び出しが失敗すると思われます。

+0

いいえ、質問によれば、1つのパラメータを受け入れる基本クラスにコンストラクタがありました。答えを見てください。ありがとうございます! – ChadD

+0

私はそれをうまく説明していないと思います。あなたは私に同意しています。 –

1

これは、どのクラスでもコンストラクタを定義しないと、コンパイラはデフォルトのパラメータなしコンストラクタが存在するとみなすからです。また、派生クラスで明示的に基本クラスコンストラクターを呼び出さない限り、プライベート基本クラスメンバーを設定することはできません。

これはC#コードです。 VBは似ているはずです。

class B 
    { 
     protected int aInt; 
     private int bInt; 
     public B() 
     { } 

     public B(int myInt) 
     { 
      aInt = myInt; 
     } 
    } 

    class S : B 
    { 
     public S(int aInt, int bInt) 
      : base(bInt) 
     { 
      base.aInt = aInt; 
     } 
    } 
+0

非常に良いpt。私はほぼ正解としてこれを選んだ。お返事ありがとうございます。 – ChadD

+0

ありがとうございます。私は、VBコードを投稿しようとしていたが、私は少し難しいと思ったし、あきらめた! –

6

クラスのコンストラクタは、継承関係でも定義されているクラスにのみ適用されます。お使いのベースクラス1、引数のコンストラクタを利用できるようにするには、(C#の場合)このような何かをする必要があると思います:

あなたが疑われるとして
public class S : B 
{ 
    public S() 
    { 
     // do something for S 
    } 

    public S(int myInt) : base(myInt) 
    { 
     // do something for S 
    } 
} 
+0

もう一度ランナーアップの答え。回答ありがとうございます。 – ChadD

2

VBを使用しているようです。この場合、サブクラスのコンストラクタから適切な基本クラスコンストラクタを明示的に呼び出す必要があります。

When an instance of a derived class is created, the Sub New constructor of the base class executes first, followed by constructors in derived classes. Link to page

これは、パラメータのない基底クラスのコンストラクタを呼び出すことができますが、派生クラスのコンストラクタから整数を受け入れ、基本クラスのコンストラクタを呼び出して、明示的にではありませんので、整数を送信しています。

0

コンストラクタの最初の文は、mybase.Newである必要があります。この理由は、すべてのクラスがObjectクラスから継承し、コンストラクタがその基本クラスのコンストラクタを呼び出す必要があるためです。

関連する問題